将3D数学转换为SSE或其他SIMD需要多少加速?

optimization x86 native sse simd

3967 观看

7回复

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

作者: Suma 的来源 发布者: 2019 年 5 月 29 日

回应 (7)


7

决定

在我的经验,我通常会看到大约提高了3倍,采取的算法从的x87上交所和更好低于5倍的改善将VMX / AltiVec技术(因为具有与管线深度,日程安排等做复杂的问题)。但是我通常只在我有数百或数千个数字操作的情况下这样做,而不是那些我一次只做一个矢量的情况。

作者: Crashworks 发布者: 22.12.2009 01:20

3

这不是整个故事,但是可以使用SIMD进一步优化,看看Miguel关于何时用他在PDC 2008上举行的MONO实施SIMD指令的演讲,

SIMD在这种特殊配置中击败了双打的屁股。
(来源:tirania.org

图片来自Miguel的博客文章。

作者: Henrik 发布者: 25.02.2009 04:11

2

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

作者: Brian Hayes 发布者: 03.10.2013 04:56

1

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

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

另一个领域是当你达到缓存或内存限制时,这又需要处理很多值/向量。

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

作者: Eric Grange 发布者: 29.05.2009 10:24

1

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

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

例如,像

命名空间SIMD {
class PackedVec4d
{
  __m128 x;
  __m128 y;
  __m128 z;
  __m128 w;

  // ...
};
}

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

作者: Rehno Lindeque 发布者: 09.09.2009 01:05

0

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

以上所有内容都让我感到非常惊讶。这非常直观。但数据谈判。

作者: user114229 发布者: 29.05.2009 10:41

-19

很可能你会看到只有非常小的加速,如果有的话,这个过程将比预期更复杂。有关更多详细信息,请参阅Fabian Giesen撰写的泛在SSE矢量类文章。

无处不在的SSE矢量类:揭穿一个共同的神话

没那么重要

首先,你的矢量类对你的程序性能可能并不像你想象的那么重要(如果是的话,它更可能因为你做错了而不是因为计算效率低)。不要误解我的意思,它可能是整个程序中最常用的类之一,至少在做3D图形时是这样。但是,仅仅因为向量操作将是常见的并不自动意味着它们将主导程序的执行时间。

不太热

不容易

现在不要

永远不会

作者: Suma 发布者: 22.09.2008 02:55
32x32