使用SIMD进行优化的极限是什么?

5

我需要优化一些C代码,这些代码执行大量的物理计算,并使用Cell处理器上的SIMD扩展。每个矢量运算符可以同时处理4个浮点数。因此,在最乐观的情况下,我希望能够获得4倍的加速。

您认为使用向量运算符能否获得更大的速度提升?

谢谢。

5个回答

4

它可以比直接浮点数提供更快的速度,因为SIMD指令可能不太精确(尽管不会引起太多问题),因此执行所需的周期更少。这真的取决于情况。

最好的计划是尽可能了解你正在优化的处理器。你可能会发现它可以给你超过4倍的改进。你可能会发现你不能。但是我们无法确定,除非了解更多关于您正在优化的算法和目标CPU的信息。


你的意思是从双精度转换为单精度吗?SSE2及更高版本支持双精度,大多数平台支持IEEE或至少满足精度要求...这并不会使单周期算术变得不常见。 - Potatoswatter
不,我没有。我在考虑我使用过的几个不同平台。其中一个是x86,在这个平台上,使用标量SSE比使用x87快得多。同样,在一个基于MIPS的平台上,并行指令比它们的标量对应物执行得更快,即使在这种情况下,你也可以同时流水线处理标准标量和并行FPU指令。 - Goz
我不这么认为。例如,PowerPC有一些只估算结果的指令,这使它们更快,但你会失去一些精度。 - Georg Schölly
我正在使用Cell处理器的SPE。 - Open the way
@Werner:如果您正在使用SPE,则我所知道的最好的速度提升是4倍,除非您进行算法优化。 - Goz
显示剩余3条评论

4

最佳的优化发生在重新思考算法时。消除不必要的步骤。寻找更加直接的方式来完成相同的结果。在与问题更相关的领域计算解决方案。

例如,如果向量数组是所有在同一条线上的n个点的列表,则仅需转换端点并插值中间点即可。


所有这些都是正确的,但与 SIMD 能为您做什么的问题无关。 - dmckee --- ex-moderator kitten
你说的 "orthogobal" 是什么意思? - Open the way

3

单独来看,不行。但如果重新编写算法以支持它们的过程也恰好改善了缓存局部性或分支行为,那么你可能会发现无关的加速效果。然而,这对于任何重写都是成立的...


这些不相关的加速通常被称为超线性加速。 - Dr. Snoopy

2

这是完全可能的。

  • 如果你知道该怎么做,那么你可以比编译器进行更加聪明的指令级微优化。
  • 大多数SIMD指令集提供了一些强大的操作,这些操作在普通的标量FPU / ALU代码中没有任何等价物(例如SSE2中的PAVG / PMIN等)。即使这些操作不能完全适用于你的问题,你也可以经常组合这些指令以获得很好的效果。
  • 不确定Cell是否有此功能,但大多数SIMD指令集都具有优化内存访问的功能,例如将数据预取到缓存中。我已经通过使用这些功能取得了非常好的结果。

现在虽然这不是关于Cell或PPC的,但我的一个简单图像卷积滤波器在Atom上获得了20倍的速度提升(C vs. SSE2),这高于并行性水平(一次16个像素)。


1

这取决于架构。目前我假设是x86架构(也称为SSE)。

你可以轻松地在紧密循环中获得四倍的优化。只需用SSE指令替换现有的数学运算即可完成。

甚至可以获得更多的优化,因为如果使用SSE,您可以在寄存器中进行数学运算,而这些寄存器通常不被编译器使用。这将为其他任务(如循环控制和地址计算)释放通用寄存器。简而言之,围绕SSE指令的代码将更加紧凑且执行速度更快。

然后还有一种选项,可以提示内存控制器您希望如何访问内存,例如,如果您希望以绕过缓存的方式存储数据或者不是。对于带宽密集型算法,这可能会给您带来额外的速度提升。


我正在使用Cell Processor的SPE。 - Open the way
哦,你正在处理器上工作。好吧,在这里完全适用不同的规则。处理能力很少成为瓶颈。相反,任务是在不停顿地将数据输入和输出SPU。这并不容易! - Nils Pipenbrinck
是的,虽然在我的情况下,数据传输不是问题(它只占用了5%的时间)。 - Open the way

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接