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

时间:2011-07-31 11:25:36

标签: c++ c simd numerical

我正在寻找类似于英特尔的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]);
}

为:

double a[ARRAY_SIZE], b[ARRAY_SIZE];
vectorized_ln(a, b, ARRAY_SIZE);

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

4 个答案:

答案 0 :(得分:7)

我开发了一个开源(BSD)Yeppp! mathematical library,它提供了一些向量基本函数(log,exp,sin,cos,tan),并且在性能上与MKL竞争。来自Yeppp的使用向量对数函数的Here is an example

答案 1 :(得分:6)

Felix von Leitner撰写了an extensive presentation on the actual assembly produced by various c compilers

关于简单操作矢量化的说明从幻灯片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会自动向量化初始代码。

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

答案 2 :(得分:4)

你可能会发现AMD的LibM库(不过是x64)与SSEPlus结合使用。还有一个Sony's Vector Math library的开源x86变体。

答案 3 :(得分:3)

除了自己编写这些函数(这不是那么多火箭科学)或使用Ignacio的链接..

可能是英特尔的SPMD编译器适合您:http://ispc.github.com/

这是一个C风格的编译器,您可以在其中以串行/标量方式编写内容,并将它们与特定目标体系结构并行化。最终的功能很容易从您的常规CPP项目调用。

我引用:“ispc编译基于C的SPMD编程语言在CPU的SIMD单元上运行;它经常在具有4宽SSE单元的CPU上提供3倍或更高的加速,而没有任何编写内在函数的困难代码“。

我自己必须尝试一下,但它对于通用计算看起来很好。并行化。