10

我在我的应用程序中广泛使用 3D 数学。通过将我的向量/矩阵库转换为 SSE、AltiVec 或类似的 SIMD 代码,我可以实现多少加速?

4

7 回答 7

7

根据我的经验,我通常会看到从 x87 到 SSE 的算法改进了 3 倍,而在使用 VMX/Altivec 时改进了 5 倍以上(因为与管道深度、调度等有关的复杂问题)。但我通常只在我有数百或数千个数字要操作的情况下这样做,而不是对于那些我一次只做一个向量的情况。

于 2009-12-22T13:20:27.077 回答
3

这还不是全部,但可以使用 SIMD 进行进一步优化,请查看 Miguel 在PDC 2008上关于何时使用 MONO 实现 SIMD 指令的演示文稿,

SIMD 在这种特殊配置中胜过双打。
(来源:tirania.org

图片来自 Miguel 的博客条目。

于 2009-02-25T04:11:29.240 回答
2

对于一些非常粗略的数字:我听说ompf.org上的一些人声称某些手动优化的光线追踪程序的速度提高了 10 倍。我也有一些很好的加速。根据问题,我估计我的例程在 2 倍到 6 倍之间,其中许多都有一些不必要的存储和负载。如果您的代码中有大量分支,请忘记它,但对于自然数据并行的问题,您可以做得很好。

但是,我应该补充一点,您的算法应该设计用于数据并行执行。这意味着如果您有一个如您所提到的通用数学库,那么它应该采用打包向量而不是单个向量,否则您只会浪费时间。

例如类似的东西

命名空间 SIMD {
类 PackedVec4d
{
  __m128 x;
  __m128 是;
  __m128 z;
  __m128 w;

  //...
};
}

大多数性能很重要的问题都可以并行化,因为您很可能会使用大型数据集。您的问题对我来说听起来像是过早优化的情况。

于 2009-09-09T13:05:47.830 回答
2

对于 3D 操作,请注意 W 组件中未初始化的数据。我已经看到由于 W 中的数据错误,SSE ops (_mm_add_ps) 需要 10 倍正常时间的情况。

于 2013-10-03T16:56:45.183 回答
1

答案很大程度上取决于图书馆在做什么以及如何使用它。

增益可以从几个百分点到“快几倍”,最容易看到增益的区域是那些您不处理孤立的向量或值,而是必须处理的多个向量或值同样的方法。

另一个领域是当您达到缓存或内存限制时,这同样需要处理大量值/向量。

增益可能最大的领域可能是图像和信号处理、计算模拟以及网格上的一般 3D 数学运算(而不是孤立向量)。

于 2009-05-29T10:24:43.400 回答
0

这些天来,x86 的所有优秀编译器都默认为 SP 和 DP 浮点数学生成 SSE 指令。只要您正确安排它们,使用这些指令几乎总是比使用本机指令更快,即使对于标量操作也是如此。这会让许多人感到惊讶,他们过去发现 SSE “慢”,并认为编译器无法生成快速的 SSE 标量指令。但是现在,您必须使用开关关闭 SSE 生成并使用 x87。请注意,此时 x87 已被有效弃用,并且可能会从未来的处理器中完全删除。这样做的一个缺点是我们可能会失去在寄存器中执行 80 位 DP 浮点的能力。但共识似乎是,如果您依赖 80 位而不是 64 位 DP 浮点数来获得精度,您应该寻找更精确的容损算法。

上面的一切对我来说都是一个完全的惊喜。这是非常反直觉的。但数据会说话。

于 2009-05-29T10:41:59.120 回答
-19

很可能您只会看到非常小的加速(如果有的话),并且该过程将比预期的更复杂。有关更多详细信息,请参阅Fabian Giesen的 The Ubiquitous SSE 矢量类文章。

无处不在的 SSE 向量类:揭穿一个常见的神话

没那么重要

首先,你的向量类对你的程序的性能可能没有你想象的那么重要(如果是,那更有可能是因为你做错了,而不是因为计算效率低下)。不要误会我的意思,它可能会成为整个程序中最常用的类之一,至少在处理 3D 图形时是这样。但是仅仅因为向量操作很常见并不意味着它们会支配你的程序的执行时间。

没那么热

不容易

现在不要

永远不会

于 2008-09-22T14:55:27.033 回答