有人知道一个开源的C++ x86 SIMD指令库吗?
英特尔在其集成性能基元库中提供了我需要的内容,但由于版权问题,我无法使用它。
编辑
我已经了解编译器提供的指令。我的需求是一个方便的接口来使用它们。
有人知道一个开源的C++ x86 SIMD指令库吗?
英特尔在其集成性能基元库中提供了我需要的内容,但由于版权问题,我无法使用它。
编辑
我已经了解编译器提供的指令。我的需求是一个方便的接口来使用它们。
看一下libsimdpp,它是一个头文件-only的C++ SIMD包装库。
该库通过单一接口支持多种指令集: SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, XOP, FMA3/4, NEON, NEONv2, Altivec。支持Clang、GCC、MSVC和ICC。
所有指令集之间的差异都通过实现缺失指令的组合来解决。作为额外的奖励,可以将相同的代码编译为几个指令集,将生成的目标文件链接到一个可执行文件中,并使用方便的动态调度机制来运行最适合当前处理器的实现。
近年来涌现了几个库,用于抽象出显式的SIMD编程。最重要的是:
最重要的是要寻找一个可用的类型集,正确地抽象出给定目标的最佳可用SIMD寄存器和指令,并且,在没有SIMD支持的系统上完全可移植。
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
看看AMD的SSEPlus项目,可能是您需要的。
微软刚刚发布了新的"DirectXMath"库。它包括对SSE2和NEON指令集的支持。文档看起来也不错。
DirectXMath API提供适合SIMD的C ++类型和函数,用于DirectX应用程序中常见的线性代数和图形数学运算。该库通过Visual Studio编译器中对SSE2和ARM-NEON指令集的支持为Windows 32位(x86)、Windows 64位(x64)和ARM上的Windows提供了优化版本。