矢量化数学函数的免费/开源C/C++库?

BD *_*ill 5 c c++ numerical simd

我正在寻找类似于英特尔的Linux矢量数学库的免费/开源C/C++(可接受的)常用数学函数(如ln或exp)的矢量化版本库.我想要一个能够让我具备以下内容的库:

double a[ARRAY_SIZE], b[ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; ++i) {
    a[i] = ln(b[i]);
}
Run Code Online (Sandbox Code Playgroud)

如:

double a[ARRAY_SIZE], b[ARRAY_SIZE];
vectorized_ln(a, b, ARRAY_SIZE);
Run Code Online (Sandbox Code Playgroud)

并使用Intel和AMD架构上提供的SIMD指令的全部功能.开发环境包含在Linux上运行的GNU工具.英特尔的数学核心库包含一个名为矢量数学库的东西,它宣传"计算密集型核心数学函数的矢量实现",包括基本函数,触发函数等,所以我正在寻找类似的东西,但是免费的.

Mar*_*han 7

我开发了一个开源(BSD)Yeppp!数学库,提供一些向量基本函数(log,exp,sin,cos,tan),并且在性能上与MKL竞争.以下是使用Yeppp的矢量对数函数的示例!


dmc*_*kee 6

Felix von Leitner撰写了一篇关于各种c编译器生成的实际装配的详尽介绍.

他关于简单操作矢量化的说明从幻灯片28开始.

  • 对于GCC 4.4和memset类型循环

    • gcc -O2生成一次写入一个字节的循环
    • gcc -O3矢量化,一次写入32位(x86)或128位(x86,具有SSE或x64)
    • 令人印象深刻的是:矢量化代码首先检查和修复对齐

Slide 41的标题是"Outsmarting the Compiler - simd-shift",并得出结论:"gcc比所有平台上的视频编解码器程序员更聪明"

幻灯片42是另一种情况,其中gcc将自动向量化初始代码.

所有这些都加起来先检查你正在使用的编译器是否只是为你处理它.


Nec*_*lis 4

您可能会发现 AMD 的LibM库(不过它适用于 x64)与SSEPlus结合起来很有用。还有索尼矢量数学库的开源 x86 变体。