【问题标题】:What is the limit of optimization using SIMD?使用 SIMD 进行优化的限制是什么?
【发布时间】:2010-09-05 17:24:21
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: c simd


    【解决方案1】:

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

    例如,如果向量数组是 n 个列表,它们都在同一条线上,那么只变换端点并插入中间点就足够了。

    【讨论】:

    • 所有这些都是正确的,但与 SIMD 可以为您做什么的问题正交......
    • 'orthogobal' 是什么意思?
    【解决方案2】:

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

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

    【讨论】:

    • 你的意思是从双精度到单精度? SSE2 和更好的支持双精度,大多数平台支持 IEEE 或至少满足精度要求……这不会使单周期算术变得不常见。
    • 不,我没有。我正在考虑我使用过的几个不同的平台。一种是 x86,其中使用标量 SSE 可以比使用 x87 快很多倍。同样在一个基于 MIPS 的平台上,并行指令的执行速度比它们的标量对应物更快,即便如此,您也可以同时流水线化标准标量和并行 FPU 指令。
    • 我不这么认为。例如,PowerPC 有只估计结果的指令,这使得它们更快,但你会损失一些精度。
    • 我正在使用 Cell Processor 的 SPE
    • @Werner:如果您使用的是 SPE,那么除非您在算法上进行优化,否则您可以获得的最佳 AFAIK 速度是 4 倍。
    【解决方案3】:

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

    【讨论】:

    • 这种不相关的加速通常被称为超级加速。
    【解决方案4】:

    这是完全可能的。

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

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

    【讨论】:

      【解决方案5】:

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

      您可以轻松地在紧环上获得因子四。只需将现有数学替换为 SSE 指令即可。

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

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

      【讨论】:

      • 我正在使用 Cell Processor 的 SPE
      • 哦,您正在研究 SPE。那么这里完全不同的规则适用。处理能力很少是瓶颈。取而代之的任务是在不停滞的情况下将数据输入和输出 SPU。这不是一件容易的事!
      • 是的,虽然在我的情况下,数据传输不是问题(需要 5% 的时间)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2014-09-18
      • 2012-09-04
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多