我处在这样一种情况下,我必须使用几乎不会改变的矩阵执行一些线性代数计算,并且在C ++中有很多小向量(非常少的3x3或4x4矩阵和带有3个值的向量),我是考虑使用为x86 32位,x86 64位,ARMv5及更高版本设置的一些CPU指令来加速并简化数学运算的设计。
令人惊讶的是我还没有找到线性代数的真实集合,其中大部分用于浮点数学,缓存,根据需要进行优化,但对于矩阵和线性代数没有什么,只是我或没有设置对于线性代数?
来自AMD的新FMA3一开始看起来很有意思,但在现代CPU中发现它仍然非常罕见,我想坚持像x86上的SSE或ARM上的ARMv5那样流行的东西。
所以有一个流行的指令集用于小而快速的线性代数计算?如果速度足够好,我甚至可以接受大量的错误。
编辑:
我还应该注意到,在实践中我的编译器是:
所以我想在x86和ARM上都有一个开源产品和一个可移植的库。
编辑2: Eigen不支持多线程执行,对我来说这是一个很大的问题。
答案 0 :(得分:3)
您可能已经知道这一点,但对于x86架构,我可以推荐您使用AVX或AVX2上的英特尔BLAS。有关详细信息,请查看此处:http://software.intel.com/en-us/articles/optimize-for-intel-avx-using-intel-math-kernel-librarys-basic-linear-algebra-subprograms-blas-with-dgemm-routine或此处http://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-blas-cblas-and-lapack-compilinglinking-functions-fortran-and-cc-calls
答案 1 :(得分:1)
您实际上并不是在寻找完整的线性代数库,而只是寻找便携式矢量运算。
搜索“可移植C ++ SIMD”会产生大量相关命中。其中最有希望的是
Vc是一个免费的软件库,可以简化C ++代码的显式矢量化。它具有直观的API,并提供不同编译器和编译器版本之间的可移植性以及不同向量指令集之间的可移植性。