有人知道开源 C++ x86 SIMD 内部函数库吗?
英特尔在他们的集成性能原语库中提供了我所需要的东西,但由于版权无处不在,我不能使用它。
编辑
我已经知道编译器提供的内在函数。我需要的是一个方便的界面来使用它们。
有人知道开源 C++ x86 SIMD 内部函数库吗?
英特尔在他们的集成性能原语库中提供了我所需要的东西,但由于版权无处不在,我不能使用它。
编辑
我已经知道编译器提供的内在函数。我需要的是一个方便的界面来使用它们。
查看libsimdpp仅标头 C++ SIMD 包装库。
该库通过单一接口支持多个指令集:SSE2、SSE3、SSSE3、SSE4.1、AVX、AVX2、AVX512F、XOP、FMA3/4、NEON、NEONv2、Altivec。支持所有 Clang、GCC、MSVC 和 ICC。
指令集之间的任何差异都可以通过将缺少的指令实现为受支持指令的组合来解决。作为奖励,可以为多个指令集编译相同的代码,将生成的目标文件链接到单个可执行文件,并使用方便的动态调度机制来运行最适合当前处理器的实现。
近年来出现了几个库来抽象显式 SIMD 编程。最重要的:
要寻找的最重要的事情是拥有一组可用的类型,这些类型可以正确抽象出给定目标的最佳可用 SIMD 寄存器和指令。而且,显然,完全可移植到不支持 SIMD 的系统。
我编写了一个GLSL 风格的库,它可以转换为质量接近完美的 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
请注意,该库还不完美,并且很可能存在未发现的错误,因为它仍然是新的。
看看AMD 的 SSEPlus 项目,可能是你的追求
微软刚刚发布了其新的“DirectXMath”库。它包括对 SSE2 和 NEON 内在函数的支持。文档看起来也不错。
DirectXMath API 为 DirectX 应用程序常见的常见线性代数和图形数学运算提供 SIMD 友好的 C++ 类型和函数。该库通过 Visual Studio 编译器中的 SSE2 和 ARM-NEON 内在函数支持为 ARM 上的 Windows 32 位 (x86)、Windows 64 位 (x64) 和 Windows 提供优化版本。
Vc是另一个实现向量类并允许编写独立于所使用的实际指令集的向量化代码的 C++ 库。