【发布时间】:2010-09-05 17:24:21
【问题描述】:
我需要使用 Cell Processor 的 SPE 上的 SIMD 扩展来优化一些 C 代码,这些代码执行大量物理计算。每个向量算子可以同时处理 4 个浮点数。因此,理想情况下,我希望在最乐观的情况下能实现 4 倍的加速。
您认为使用矢量运算符可以带来更大的加速吗?
谢谢
【问题讨论】:
我需要使用 Cell Processor 的 SPE 上的 SIMD 扩展来优化一些 C 代码,这些代码执行大量物理计算。每个向量算子可以同时处理 4 个浮点数。因此,理想情况下,我希望在最乐观的情况下能实现 4 倍的加速。
您认为使用矢量运算符可以带来更大的加速吗?
谢谢
【问题讨论】:
最好的优化发生在重新思考算法。消除不必要的步骤。找到更多实现相同结果的直接方法。在与问题更相关的领域中计算解决方案。
例如,如果向量数组是 n 个列表,它们都在同一条线上,那么只变换端点并插入中间点就足够了。
【讨论】:
它可以提供比直接浮点更高的速度 4 倍,因为 SIMD 指令可能不太精确(但不会带来太多问题),因此执行周期更少。这真的取决于。
最好的计划是尽可能多地了解您正在优化的处理器。您可能会发现它可以为您提供远远超过 4 倍的改进。你可能会发现你做不到。但是,如果不了解您正在优化的算法以及您的目标 CPU 的更多信息,我们就不能说。
【讨论】:
靠他们自己,不。但是,如果重写算法以支持它们的过程也恰好改善了缓存局部性或分支行为,那么您可能会发现不相关的加速。但是,任何重写都是如此……
【讨论】:
这是完全可能的。
现在这根本不是 Cell 或 PPC,而是我的一个简单的图像卷积滤波器在 Atom 上获得了 20 倍的加速(C 与 SSE2),这高于并行度(一次 16 个像素) .
【讨论】:
这取决于架构。目前我假设 x86 架构(又名 SSE)。
您可以轻松地在紧环上获得因子四。只需将现有数学替换为 SSE 指令即可。
您甚至可以获得更多,因为如果您使用 SSE,您会在编译器通常不使用的寄存器中进行数学运算。这为循环控制和地址计算等其他任务释放了通用寄存器。简而言之,围绕 SSE 指令的代码将更紧凑,执行速度更快。
然后可以选择提示内存控制器如何访问内存,例如如果您想以绕过缓存的方式存储数据。对于需要带宽的算法,可能会在此基础上为您提供更多额外的速度。
【讨论】: