【发布时间】:2013-03-21 09:06:22
【问题描述】:
我正在寻找 SSE 和 AVX 的 SIMD 数学库(最好是开源的)。我的意思是,例如,如果我有一个带有 8 个浮点值的 AVX 寄存器 v,我希望 sin(v) 一次返回所有八个值的 sin。
AMD 有一个专有库 LibM http://developer.amd.com/tools/cpu-development/libm/,它具有一些 SIMD 数学函数,但 LibM 仅在检测到英特尔 CPU 没有的 FMA4 时才使用 AVX。此外,我不确定它是否完全使用 AVX,因为所有函数名称都以 s4 (d2) 而不是 s8 (d4) 结尾。它比 Intel CPU 上的标准数学库提供更好的性能,但也好不了多少。
英特尔将 SVML 作为其 C++ 编译器的一部分,但编译器套件在 Windows 上非常昂贵。此外,英特尔会削弱非英特尔 CPU 上的库。
我找到了以下 AVX 库 http://software-lisc.fbk.eu/avx_mathfun/,它支持一些数学函数(exp、log、sin、cos 和 sincos)。它为我提供了非常快的结果,比 SVML 更快,但我没有检查准确性。它仅适用于单浮点,在 Visual Studio 中不起作用(尽管这很容易修复)。它基于另一个 SSE 库。
还有人有其他建议吗?
编辑:我找到了一个关于这个主题有很多答案的 SO 线程 Vectorized Trig functions in C?
【问题讨论】:
-
虽然它是一个专有解决方案,但英特尔的数学内核库是一个非常全面的选择。但是,它仅在 Intel CPU 上表现最佳。我相信过去众所周知,在非英特尔处理器上运行时会转向未优化的代码路径。不过,我不确定当代版本是否就是这种情况。
-
Agner Fog 的 Vector Class Library 已通过 GPL。它更像是英特尔内部函数的包装器,使手动矢量化更加方便,但也有一些数学库函数,如 exp 和 log。