我正在为SSE和AVX寻找SIMD数学库(最好是开源)。我的意思是,例如,如果我有一个具有8个浮点值的AVX寄存器v,我希望sin(v)一次返回所有八个值的sin。
AMD有一个propreitery库,LibM http://developer.amd.com/tools/cpu-development/libm/,它具有一些SIMD数学函数,但如果它检测到Intel CPU没有的FMA4,则LibM仅使用AVX。另外我不确定它是否完全使用AVX,因为所有的功能名称都以s4(d2)而不是s8(d4)结尾。它提供了比英特尔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?
答案 0 :(得分:8)
我已经将Vecmathlib https://bitbucket.org/eschnett/vecmathlib/实现为另外两个项目的通用库(The Einstein Toolkit和pocl http://pocl.sourceforge.net/)。 Vecmathlib是开源的,用C ++编写。
答案 1 :(得分:1)
Gromacs是一个高度优化的分子动力学软件包,用C ++编写,可以使用SIMD。据我所知,数学SIMD功能还没有拆分成一个单独的库,但我想这个实现可能对其他人有用。
https://github.com/gromacs/gromacs/blob/master/src/gromacs/simd/simd_math.h
http://manual.gromacs.org/documentation/2016.4/doxygen/html-lib/simd__math_8h.xhtml