【问题标题】:SIMD math libraries for SSE and AVXSSE 和 AVX 的 SIMD 数学库
【发布时间】: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 上表现最佳。我相信过去众所周知,在非英特尔处理器上运行时会转向未优化的代码路径。不过,我不确定当代版本是否就是这种情况。
  • 这里可以取对数:stackoverflow.com/a/45898937/1915854
  • Agner Fog 的 Vector Class Library 已通过 GPL。它更像是英特尔内部函数的包装器,使手动矢量化更加方便,但也有一些数学库函数,如 exp 和 log。

标签: sse simd avx math.h


【解决方案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

【讨论】:

    【解决方案2】:

    我已将 Vecmathlib https://bitbucket.org/eschnett/vecmathlib/ 实现为其他两个项目(The Einstein Toolkit 和 pocl http://pocl.sourceforge.net/)的通用库。 Vecmathlib 是开源的,是用 C++ 编写的。

    【讨论】:

    • 这似乎正是我正在寻找的那种包。我会试一试,然后回复你。
    • 那个库看起来很有前途,但我遇到了几个问题:a)由于缺少#endif,bitbucket 上的版本无法编译 b)基准数据看起来非常令人失望,通常VML 在我的测试中慢了一个数量级 - 这里是 MINGW on windows。似乎无法用 MSVC 编译
    猜你喜欢
    • 2014-01-04
    • 2014-03-10
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2011-03-08
    • 2012-03-09
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多