优秀的可移植SIMD库

29

有没有人能推荐一个可移植的SIMD库,提供C / C ++ API,在Intel和AMD扩展以及Visual Studio、GCC兼容。我想加速一些操作,比如对512x512的double数组进行缩放,向量点积,矩阵乘法等。

到目前为止,我找到的唯一一个是:http://simdx86.sourceforge.net/,但正如第一页所说的那样,它无法在Visual Studio上编译。

还有Intel IPP,据我了解它不适用于AMD。 还有来自AMD的Framewave,但是我在编译和链接他们的库时遇到了一些问题,他们的论坛完全停滞不前。 有人在任何地方使用过Framewave吗?

谢谢。


我曾经看到过一个关于这个主题的硕士论文,但我无论如何都想不起应该在搜索中使用什么术语来找到它。 - dmckee --- ex-moderator kitten
8
请查看libsimdpp 库 - 它提供了SSE2-SSE4.1、AVX、AVX2、NEON、FMA3/4和XOP指令的通用接口。此外,它还提供了便利的动态调度机制:相同的源代码可以使用不同的编译器选项进行多次编译(命名空间负责ODR),链接到同一可执行文件中,库将自动选择目标处理器的最佳实现。(免责声明:我是作者) - user12
最好将此问题迁移到http://softwarerecs.stackexchange.com。 - eonil
5个回答

11

Eigen是一个MPL2许可的仅包含头文件的C++库,具有针对SSE、Neon和Altivec进行优化的向量/矩阵数学功能。他们在附加模块中拥有更为复杂的数学运算。


2
Eigen已重新授权为MPL2 http://eigen.tuxfamily.org/index.php?title=News:Relicensed_to_MPL2 ,这是一个好的步骤。 - Evgeny Panasyuk
谢谢。我已经更新了答案以反映此事。 - Jim Hunziker

11

由于您提到矩阵和向量的高级操作,因此可能会对ATLAS, Intel's MKL, PLASMAFLAME感兴趣。

一些C++矩阵数学库包括Boost的uBLAS、Armadillo、Eigen、IT++和Newmat。POOMA库可能也包含其中一些内容。这个问题还涉及MTL。

如果您正在寻找更低级别的可移植原语,则我的同事开发了一个SSE2、Altivec、VSX、Larrabee和Cell SPE向量操作的包装器。它可以在我们的源代码库中找到,但其许可证(学术)可能不适合您将其作为您工作的一部分进行分发。它仍在积极开发中,以涵盖其针对的应用需求范围。


3
尝试使用liboil或相关的ORC,特别是ORC非常有趣;它实现了一种高级汇编语言,可以编译成特定于架构的代码。非常复杂,比简单的包装库要复杂得多。

3

2
如果您不介意使用汇编语言,则可以使用所有SIMD指令的内在函数。它们将是特定于处理器的,即SSE4内部函数只能在启用了SSE4的CPU上运行,并且由您来确保扩展存在。
这里有一篇关于应用SIMD的好文章here
但是,您可以使用生成SIMD代码的编译器,而无需使用任何外部库。VectorC被认为很好,尽管我个人从未使用过。据我所知,它不需要任何特殊的库,只需查找那些可以从SIMD中受益的源代码位,并编译到您指定的任何SSE级别。

谢谢,避免使用特定于处理器的汇编语言是我的主要目标。我不想担心CPU是否支持SSE或SSE2并在某些情况下编写两个不同版本的代码。我希望有人已经在库中完成了这项工作 =)。同样适用于编译器特定扩展等。 - Budric

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