使用SIMD优化的限制是什么?

时间:2010-09-05 17:24:22

标签: c simd

我需要在Cell处理器的SPE上使用SIMD扩展来优化一些C代码,这些代码可以进行大量的物理计算。每个向量运算符可以同时处理4个浮点数。理想情况下,我希望在最乐观的情况下加速4倍。

您认为使用向量运算符可以提供更大的加速吗?

由于

5 个答案:

答案 0 :(得分:4)

由于SIMD指令可能不太精确(不过太多会产生太多问题),因此它可以提供比直线浮点数高4倍的速度,因此执行的周期更少。这真的取决于。

最佳计划是尽可能多地了解您正在优化的处理器。您可能会发现它可以比4倍的改进更好。你可能会发现你做不到。我们不能说虽然不了解您正在优化的算法以及您正在瞄准的CPU。

答案 1 :(得分:4)

在重新思考算法时会出现最佳优化。消除不必要的步骤。找到更多直接的方法来完成相同的结果。计算与问题更相关的域中的解决方案。

例如,如果矢量数组是 n 的列表,它们都在同一行上,那么只转换端点并插入中间点就足够了。

答案 2 :(得分:3)

靠自己,没有。但是,如果重写您的算法以支持它们的过程也恰好改善了缓存局部性或分支行为,那么您可以找到无关的加速。但是,任何重写都是如此......

答案 3 :(得分:2)

这完全有可能。

  • 如果你知道自己在做什么,你可以做比编译器更聪明的指令级微优化。
  • 大多数SIMD指令集提供了几个功能强大的操作,这些操作在正常的标量FPU / ALU代码中没有任何等价物(例如SSE2中的PAVG / PMIN等)。即使这些问题并不完全符合您的问题,您也可以经常将这些说明结合起来以获得很好的效果。
  • 不确定Cell,但大多数SIMD指令集都具有优化内存访问的功能,例如将数据预取到缓存中。我对这些结果非常好。

现在这根本不是Cell或者PPC,但我的一个简单的图像卷积滤波器在Atom上获得了20倍的加速(C vs. SSE2),高于并行度(一次16个像素)

答案 4 :(得分:1)

这取决于架构..目前我假设x86架构(又名SSE)。

您可以轻松地在紧密循环中获得因子四。只需用SSE指令替换现有的数学,就可以了。

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

然后可以选择提示内存控制器如何访问内存,例如:如果要以绕过缓存的方式存储数据。对于带宽饥饿的算法,可以为您提供更多的额外速度。

相关问题