C++ SSE SIMD框架

23

有人知道一个开源的C++ x86 SIMD指令库吗?

英特尔在其集成性能基元库中提供了我需要的内容,但由于版权问题,我无法使用它。

编辑

我已经了解编译器提供的指令。我的需求是一个方便的接口来使用它们。


你需要哪些具体的函数? - Jeremiah Willcock
2
SSE2和面向对象编程?对我来说听起来毫不相关。 - YeenFei
1
IPP现在已经包含在英特尔的ICC编译器中,当您在交付成果物中使用IPP例程时,没有版税或其他许可限制。您到底遇到了什么“版权问题”? - Paul R
@Paul R.:哦,是啊。不知怎么就要花200美元了。 - user283145
2
@jobs34yp:ICC在Linux上的非商业使用是免费的。如果您打算进行商业使用,那么与您在性能关键代码上获得的收益相比,编译器的成本微不足道。 - Paul R
显示剩余2条评论
8个回答

25

看一下libsimdpp,它是一个头文件-only的C++ SIMD包装库。

该库通过单一接口支持多种指令集: SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, XOP, FMA3/4, NEON, NEONv2, Altivec。支持Clang、GCC、MSVC和ICC。

所有指令集之间的差异都通过实现缺失指令的组合来解决。作为额外的奖励,可以将相同的代码编译为几个指令集,将生成的目标文件链接到一个可执行文件中,并使用方便的动态调度机制来运行最适合当前处理器的实现。


1
libdimdpp仍然得到支持和开发吗? - Walter
我不知道,但我们选择了1.0版本,因为2.0版本仍处于“测试”阶段,而且我们完全感到失望。不仅如此,还没有文档:没有办法将值加载到寄存器中(那些名称暗示它的函数也没有这样做),并且带有浮点寄存器的代码甚至无法编译。我强烈建议不要使用它。 - Sebastian Graf
2
@Sebastian,你应该关注现在发布候选阶段的2.0版本。由于所有支持的配置都在不断测试中,因此应该几乎没有任何错误。文档也得到了显着改进。免责声明:我是该库的作者。 - p12
@Sebastian:关于你所看到的问题,你是否已经报告了它们?我认为这个库被错误地使用了,因为它在大型项目中被广泛使用而没有出现问题。话虽如此,实际的1.0版本确实可能存在漏洞,尽管大多数是编译器特定的,因为只进行了有限的测试来支持所有支持的配置排列,并且开发迅速推进。 - p12
好的,我没有报告他们。回顾当时写下那个评论的时候,我一定非常沮丧,而我写的内容可能并不完全公正。然而,我们已经完成了我们的项目(一个学期的作业),自那以后我就没有再研究过libsimdpp了。 - Sebastian Graf

12

近年来涌现了几个库,用于抽象出显式的SIMD编程。最重要的是:

  • Vc
  • boost::simd(实际上不在boost中 - 是NT²的一部分)
  • Agner Fog教授的Vectorclass库

最重要的是要寻找一个可用的类型集,正确地抽象出给定目标的最佳可用SIMD寄存器和指令,并且,在没有SIMD支持的系统上完全可移植。


2
Vectorclass库不是一个宽松许可证下的库,只有GPL或商业许可证。 - p12

6
我写了一个类似GLSL的库glsl-sse2,可以将其转换为接近完美质量的ASM代码。
一个非常常见的操作 - 叉积:
vec4 cross(const vec4 &a, const vec4 &b)
{
    return a.yzxw * b.zxyw - a.zxyw * b.yzxw;
}

使用glsl-sse2将会把它转换成以下汇编代码:

_Z5crossRK4vec4S1_:
    movaps    (%rsi), %xmm1
    movaps    (%rdx), %xmm2
    pshufd    $201, %xmm1, %xmm5
    pshufd    $210, %xmm2, %xmm0
    pshufd    $210, %xmm1, %xmm4
    pshufd    $201, %xmm2, %xmm3
    mulps     %xmm0, %xmm5
    mulps     %xmm3, %xmm4
    subps     %xmm4, %xmm5
    movaps    %xmm5, (%rdi)
    ret

请注意,该库尚不完美,很可能存在未发现的错误,因为它仍然是新的。

5

那里再也没有提到任何叫做SSEPlus的东西了。 - Violet Giraffe
@VioletGiraffe:AMD有一个很烦人的习惯,经常会破坏链接,我更新了指向SourceForge页面的链接。 - Necrolis
最后更新于2009年,它稳定吗? - Violet Giraffe
2
@VioletGiraffe:从技术上讲,最后一次更新是在2008年,因为它只包括SSE,因此缺少像FMA、XOP和VMX这样的新集。就稳定性而言,它基本上只是一个大型的包装器集合,所以应该非常稳定。 - Necrolis

3

微软刚刚发布了新的"DirectXMath"库。它包括对SSE2和NEON指令集的支持。文档看起来也不错。

DirectXMath API提供适合SIMD的C ++类型和函数,用于DirectX应用程序中常见的线性代数和图形数学运算。该库通过Visual Studio编译器中对SSE2和ARM-NEON指令集的支持为Windows 32位(x86)、Windows 64位(x64)和ARM上的Windows提供了优化版本。


2

Vc是另一个C++库,它实现了矢量类,并允许编写与实际使用的指令集无关的矢量化代码。


3
Vc在ARM架构上不支持NEON,对吗? - Brent Faust

1

你可能想看看macstl - 尽管它最初是为Mac(和PowerPC)开发的,但现在也适用于Linux和x86。

此外,如果你正在处理图像,那么可以看看OpenCV - 它具有许多常见图像处理任务的SSE优化例程,并且具有C和C++ API。


0

1
GCC和英特尔编译器也具有大部分/全部这些功能。 - Jeremiah Willcock
我认为他正在寻找的不仅仅是内在功能(我猜想是某种更高级别的抽象),但具体是什么还不清楚。 - Paul R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接