11

我正在寻找一个专注于图形的小型(4x4)矩阵运算的 SIMD 库。有很多单精度的,但我需要同时支持单精度和双精度。

我看过英特尔的 IPP MX 库,但我更喜欢有源代码的东西。我对这些特定操作的 SSE3+ 实现非常感兴趣:

  1. Mat4 * Mat4
  2. Mat4 * Vec4
  3. Mat4 * Mat4 数组
  4. Mat4 * Vec4 数组
  5. Mat4 反转(很高兴拥有)

编辑:请不要“过早优化”答案。任何使用过小矩阵的人都知道 GCC 不会向量化这些以及手动优化的内在函数或 ASM。在这种情况下,这很重要,否则我不会问。

4

5 回答 5

9

也许是Eigen图书馆?

它支持 SSE 2/3/4、ARM NEON 和 AltiVec 指令集。

于 2011-04-21T19:57:41.853 回答
3

Eigen支持固定大小的矩阵。可以在堆栈上分配小的固定大小的矩阵以获得更好的性能。4x4 适合 SSE,因为 SSE 向量大小为 128 位。一行或一列 4 个双精度数字将均匀地放入 2x128 位 SSE 向量中。这使得 SIMD 的实现变得容易。

另一种选择是自己编写代码。由于您的矩阵很小并且适合 L1 缓存,因此您不必为大型矩阵所需的内存标题而烦恼。您可以使用 AVX 以获得更好的性能。较新版本的 GCC 和 Visual C++ 2010 支持 AVX 内部函数。AVX 向量大小为 256 位,可以正好容纳 4 个双精度数。

于 2011-04-21T23:17:00.223 回答
1

这里有一个 4x4 AVX 实现。它是作为示例应用程序编写的,但我相信任何人将有趣的部分提取到共享库中都不会太难。尽管对于将来在这里下车的人来说,原始问题的年龄已经很大,但我想我会发布这个。

于 2012-03-02T21:24:32.060 回答
1

还没有完全完成,但我想推销我自己的库 - glsl-sse2

于 2011-04-24T04:39:41.033 回答
-4

如果您使用的是现代编译器,则可能无需费心。大多数编译器的自动向量化应该能够轻松地将for具有固定边界的循环转换为 SIMD 代码。GCC 已经有很长一段时间了,它是 Intel 编译器的主要卖点之一(尽管如果您可能想使用 AMD 芯片,则应该小心使用 Intel 的编译器)。

于 2011-04-21T19:48:19.337 回答