2010-09-05 54 views
5

我需要使用单元处理器的SPE上的SIMD扩展来优化一些C代码,这些代码会进行大量的物理计算。每个矢量运算符可以同时处理4个浮点数。所以理想情况下,我希望在最乐观的情况下可以提高4倍的速度。使用SIMD进行优化的限制是什么?

你认为矢量运算符的使用可以带来更大的加速吗?

谢谢

回答

4

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

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

+0

是的,目前这是我正在考虑的最佳选择。 – flow 2010-09-05 17:41:57

+0

所有这些都是正确的,但正交于SIMD可以为您做些什么的问题...... – dmckee 2010-09-05 19:17:53

+0

您对'orthogobal'的含义是什么? – flow 2010-09-06 06:55:02

3

自己,没有。但是,如果重写你的算法来支持它们的过程也会改善,例如缓存局部性或分支行为,那么你可能会发现无关的加速。但是,对于任何重写都是如此......

+0

这种不相关的加速通常被称为superliner加速。 – 2010-09-05 17:30:40

4

由于SIMD指令可能不太准确,它可以给出比直接浮点更好的速度超过4倍(尽管如此,尽管给出了太多的问题)所以需要更少的周期来执行。这真的取决于。

最好的计划是尽可能多地学习您正在优化的处理器。你可能会发现它可以让你远远胜过4倍的改进。你可能会发现你不能。我们不能不知道更多关于您正在优化的算法以及您的目标CPU。

+0

你是说从双精度到单精度? SSE2和更好的支持双精度,并且大多数平台支持IEEE或者至少满足精度要求......这不会使得单周期算法不常见。 – Potatoswatter 2010-09-05 17:37:20

+0

不,我不知道。我正在考虑使用了几个不同的平台。一种是x86,使用标量SSE的速度比使用x87快很多倍。同样,在一个基于MIPS的平台上,并行指令的执行速度比其标量对应的更快,即便如此,您也可以同时处理标准标量和并行FPU指令。 – Goz 2010-09-05 17:44:45

+0

我不这么认为。例如,PowerPC只有估计结果的指令,这使得它们快很多,但是你失去了一些精度。 – 2010-09-05 17:45:41

1

这取决于体系结构。目前我假设x86体系结构(又名SSE)。

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

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

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

+0

这也是一个好点 – flow 2010-09-05 17:43:43

+0

我正在使用SPE的细胞处理器 – flow 2010-09-05 17:46:51

+0

哦,你在SPE上工作。那么这里适用完全不同的规则。处理能力很少是一个瓶颈。相反,它的任务是在没有拖延的情况下将数据导入和导出SPU。不要做小事! – 2010-09-05 18:52:49

2

这是完全可能的。

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

现在这不是细胞或PPC在所有,但我的一个简单的图像卷积滤波器得到了一个20倍的加速比(C对比SSE2)上原子,其比平行性的电平在16个像素高(一次)。