我正在寻找类似于英特尔的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工具。英特尔的数学核心库包含一个名为矢量数学库的东西,它宣传“计算密集型核心数学函数的矢量实现”,包括基本函数,触发函数等,所以我正在寻找类似的东西,但是免费。
答案 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
类型循环
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倍或更高的加速,而没有任何编写内在函数的困难代码“。
我自己必须尝试一下,但它对于通用计算看起来很好。并行化。