5

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

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

谢谢

4

5 回答 5

4

它可以提供比直接浮点更高的速度 4 倍,因为 SIMD 指令可能不太精确(虽然不会给出太多问题),因此执行周期更少。这真的取决于。

最好的计划是尽可能多地了解您正在优化的处理器。您可能会发现它可以为您提供远远超过 4 倍的改进。你可能会发现你做不到。如果不了解更多关于您正在优化的算法和您的目标 CPU,我们不能说。

于 2010-09-05T17:32:08.670 回答
4

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

例如,如果向量数组是在同一行上的n个列表,则仅对端点进行变换并对中间点进行插值就足够了。

于 2010-09-05T17:32:09.657 回答
3

就他们自己而言,没有。但是,如果重写算法以支持它们的过程也恰好改善了缓存局部性或分支行为,那么您可能会发现不相关的加速。然而,任何重写都是如此……

于 2010-09-05T17:28:11.930 回答
2

这是完全可能的。

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

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

于 2010-09-05T18:28:21.423 回答
1

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

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

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

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

于 2010-09-05T17:36:10.630 回答