在C++中,我必须用一个几乎永远不变的矩阵和很多小向量(非常少的3x3或4x4矩阵和3值向量)执行一些线性代数计算,我正在考虑使用一些针对x86 32位、x86 64位、ARMv5及更高版本的CPU指令集来加快速度并简化数学运算的设计。
令人惊讶的是,我还没有找到一个真正的线性代数集,它们大多用于浮点数学,根据您的需要进行缓存和优化,但没有真正用于矩阵和线性代数的集,这只是我自己,还是没有线性代数集?
AMD的新FMA3一开始看起来很有趣,但在现代CPU中仍然很少见,我想坚持使用x86上的SSE或ARM上的ARMv5这样流行的产品。
那么,有一个流行的用于小型快速线性代数计算的指令集吗?如果速度足够好的话,我甚至可以接受大量的错误。
编辑:
我还应该注意到,在实践中,我的编译器是:
- gcc
- 明
- Visual Studio
所以我想在x86和ARM上都有一个开源产品和一个可移植的库。
第2版:Eigen不支持多线程执行,这对我来说是个大问题。
您可能已经对此有所了解,但对于x86体系结构,我可以向您推荐Intel BLAS而非AVX或AVX2。有关详细信息,请查看此处: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
您实际上并不是在寻找一个完整的线性代数库,而是在寻找可移植的向量运算。
搜索"可移植C++SIMD"会产生大量相关的点击量。其中最有前景的是
- Vc:用于C的可移植、零开销SIMD库++
Vc是一个免费的软件库,用于简化C++代码的显式矢量化。它有一个直观的API,并提供不同编译器和编译器版本之间的可移植性,以及不同向量指令集之间的可迁移性。