我正在寻找一个针对图形的小型(4x4)矩阵运算的SIMD库。那里有很多单精度的,但我需要支持单精度和双精度。
我看过英特尔的IPP MX库,但我更喜欢有源代码的东西。我对这些特定操作的SSE3 +实现非常感兴趣:
编辑:请不要“过早优化”答案。任何使用小矩阵的人都知道GCC不会对这些以及手动优化的内在函数或ASM进行矢量化。在这种情况下,这很重要,或者我不会问。
答案 0 :(得分:9)
也许是Eigen图书馆?
支持SSE 2/3/4,ARM NEON和AltiVec指令集。
答案 1 :(得分:3)
Eigen支持固定大小的矩阵。可以在堆栈上分配小的固定大小矩阵以获得更好的性能。 4x4适用于SSE,因为SSE向量大小为128位。 4个双精度数的行或列将均匀地拟合到2x128位SSE向量中。这使SIMD实现变得容易。
另一种选择是自己编码。由于矩阵很小并且适合L1缓存,因此您无需为大型矩阵所需的内存标题而烦恼。您可以使用AVX获得更好的性能。较新版本的GCC和Visual C ++ 2010支持AVX内在函数。 AVX向量大小为256位,可以精确保存4个双精度数。
答案 2 :(得分:1)
尚未完全完成,但我想推销我自己的图书馆 - glsl-sse2。
答案 3 :(得分:1)
有一个4x4 AVX实施here。它是作为示例应用程序编写的,但我确信任何人都不会将有趣的部分提取到共享库中。以为我会发布这个,尽管原来问题的年龄对于将来在这里下车的人来说。
答案 4 :(得分:-4)
如果您使用的是现代编译器,则可能不需要打扰。大多数编译器的自动向量化应该能够轻松地将具有固定边界的for
循环转换为SIMD代码。 GCC已经为quite a while提供了这个功能,它是英特尔编译器的主要卖点之一(尽管如果你想使用AMD芯片,你应该小心使用英特尔的编译器。)