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

6

我正在寻找一款免费/开源的C/C++库(两者都可以接受),其中包含常见数学函数(如ln或exp)的矢量化版本,类似于Intel的Linux矢量数学库。 我希望能够使用这样的库来编写类似以下代码:

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工具组成。Intel的数学内核库包含一些称为Vector Math Library的东西,它广告宣传“计算密集型核心数学函数的向量实现”,包括基本函数、三角函数等等,因此我正在寻找类似于免费的东西。


“C/C++” 是我最不想看到的东西,因为它们并不是同一种语言。 - Delan Azabani
编辑以表明任何一种语言都可以接受。 - BD at Rivenhill
4个回答

8

我开发了一个开源(BSD)的 Yeppp! 数学库,提供一些向量基本函数(log、exp、sin、cos、tan),与MKL在性能上相当。这里是使用来自Yeppp! 的向量对数函数的示例


干得好,伙计!谢谢! - Nicu Tofan
1
该网站(http://www.yeppp.info)目前无法访问(至少对我来说是这样),但这是代码库:https://bitbucket.org/MDukhan/yeppp - Cody Piersall

6

Felix von Leitner撰写了有关各种c编译器实际生成的汇编代码的详尽介绍

他关于简单操作向量化的注释从第28页开始。

  • 对于GCC 4.4和memset类型的循环

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

第41页标题为"Outsmarting the Compiler - simd-shift",并得出结论:"在所有平台上,gcc都比视频编解码程序员聪明"

第42页是另一个例子,其中gcc将自动向量化天真的代码。

所有这些都意味着首先检查您正在使用的编译器是否会为您处理它。


我已经打算使用各种方法编写这个程序的几个版本,包括OpenMP、编写为适合自动向量化的循环以及可能的内部函数。由于我正在处理的函数包括exp()和log(),因此我正在寻找一个具有这些函数的向量化版本的库,以便将它们嵌入到我的程序中,以查看是否有性能提升。感谢调查链接。 - BD at Rivenhill
很好,但我对一些已经支持的转换和优化感到惊讶,并认为其他人可能也有同样的感受。 - dmckee --- ex-moderator kitten

4

我一定会看看libM/SSEPlus如何用于这个问题,因为AMD是我们的目标架构之一。看起来,向量数学库已经嵌入到了Bullet游戏物理库中(目前托管在http://code.google.com/p/bullet/)。快速查看类层次结构表明它可能对我的目的来说太高级了,但我会深入研究以确保,反正我还看到了其他一些有趣的东西。 - BD at Rivenhill
@dbliss:已修复,但很烦人他们不能永久链接这些东西... - Necrolis

3
除了自己编写这些函数(这并不是那么高深的技术)或使用Ignacio的链接之外,可能Intel的SPMD编译器适合您:http://ispc.github.com/
它是一个C样式编译器,您可以以串行/标量方式编写代码,它将使用特定的目标架构并行化代码。生成的函数很容易从常规CPP项目中调用。
我引用一句话:“ispc将基于C的SPMD编程语言编译为在CPU的SIMD单元上运行;它经常在具有4个宽SSE单元的CPU上提供3倍或更多的加速,而无需编写嵌入式代码。”。
我还没有尝试过,但它看起来非常适合通用计算并行化。

根据上述Oil Runtime Compiler,我之前没有考虑过使用另一种语言来链接我的代码,但现在我会考虑。 - BD at Rivenhill
只要你不进行任何改装,我可以想象拥有一组小程序(类似于图形着色器),处理重型数学任务会非常优雅。而且ISPC具有不同的后端(免费多平台),未来可能还会有更多。 - nielsj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接