我需要使用单元处理器的SPE上的SIMD扩展来优化一些C代码,这些代码会进行大量的物理计算。每个矢量运算符可以同时处理4个浮点数。所以理想情况下,我希望在最乐观的情况下可以提高4倍的速度。使用SIMD进行优化的限制是什么?
你认为矢量运算符的使用可以带来更大的加速吗?
谢谢
我需要使用单元处理器的SPE上的SIMD扩展来优化一些C代码,这些代码会进行大量的物理计算。每个矢量运算符可以同时处理4个浮点数。所以理想情况下,我希望在最乐观的情况下可以提高4倍的速度。使用SIMD进行优化的限制是什么?
你认为矢量运算符的使用可以带来更大的加速吗?
谢谢
重新考虑算法时发生了最佳优化。消除不必要的步骤。找到更多完成相同结果的直接方法。在与问题更相关的域中计算解决方案。
例如,如果矢量数组是一列n它们都在同一行上,那么仅转换终点并插入中间点就足够了。
自己,没有。但是,如果重写你的算法来支持它们的过程也会改善,例如缓存局部性或分支行为,那么你可能会发现无关的加速。但是,对于任何重写都是如此......
这种不相关的加速通常被称为superliner加速。 – 2010-09-05 17:30:40
由于SIMD指令可能不太准确,它可以给出比直接浮点更好的速度超过4倍(尽管如此,尽管给出了太多的问题)所以需要更少的周期来执行。这真的取决于。
最好的计划是尽可能多地学习您正在优化的处理器。你可能会发现它可以让你远远胜过4倍的改进。你可能会发现你不能。我们不能不知道更多关于您正在优化的算法以及您的目标CPU。
你是说从双精度到单精度? SSE2和更好的支持双精度,并且大多数平台支持IEEE或者至少满足精度要求......这不会使得单周期算法不常见。 – Potatoswatter 2010-09-05 17:37:20
不,我不知道。我正在考虑使用了几个不同的平台。一种是x86,使用标量SSE的速度比使用x87快很多倍。同样,在一个基于MIPS的平台上,并行指令的执行速度比其标量对应的更快,即便如此,您也可以同时处理标准标量和并行FPU指令。 – Goz 2010-09-05 17:44:45
我不这么认为。例如,PowerPC只有估计结果的指令,这使得它们快很多,但是你失去了一些精度。 – 2010-09-05 17:45:41
这取决于体系结构。目前我假设x86体系结构(又名SSE)。
您可以轻松地在紧密环路上获得第四因子。只需用SSE指令替换现有的数学,就完成了。
你甚至可以获得更多的信息,因为如果你使用SSE,你可以在编译器通常不使用的寄存器中进行数学运算。这为通用寄存器释放了其他任务,如循环控制和地址计算。简言之,围绕SSE指令的代码将更加紧凑并且执行速度更快。
然后可以选择提示内存控制器如何访问内存,例如,如果您想要以绕过缓存的方式存储数据。对于需要带宽的算法,可能会给你更多的额外速度。
这是完全可能的。
现在这不是细胞或PPC在所有,但我的一个简单的图像卷积滤波器得到了一个20倍的加速比(C对比SSE2)上原子,其比平行性的电平在16个像素高(一次)。
是的,目前这是我正在考虑的最佳选择。 – flow 2010-09-05 17:41:57
所有这些都是正确的,但正交于SIMD可以为您做些什么的问题...... – dmckee 2010-09-05 19:17:53
您对'orthogobal'的含义是什么? – flow 2010-09-06 06:55:02