我需要优化一些C代码,这些代码执行大量的物理计算,并使用Cell处理器上的SIMD扩展。每个矢量运算符可以同时处理4个浮点数。因此,在最乐观的情况下,我希望能够获得4倍的加速。
您认为使用向量运算符能否获得更大的速度提升?
谢谢。
它可以比直接浮点数提供更快的速度,因为SIMD指令可能不太精确(尽管不会引起太多问题),因此执行所需的周期更少。这真的取决于情况。
最好的计划是尽可能了解你正在优化的处理器。你可能会发现它可以给你超过4倍的改进。你可能会发现你不能。但是我们无法确定,除非了解更多关于您正在优化的算法和目标CPU的信息。
最佳的优化发生在重新思考算法时。消除不必要的步骤。寻找更加直接的方式来完成相同的结果。在与问题更相关的领域计算解决方案。
例如,如果向量数组是所有在同一条线上的n个点的列表,则仅需转换端点并插值中间点即可。
单独来看,不行。但如果重新编写算法以支持它们的过程也恰好改善了缓存局部性或分支行为,那么你可能会发现无关的加速效果。然而,这对于任何重写都是成立的...
这是完全可能的。
现在虽然这不是关于Cell或PPC的,但我的一个简单图像卷积滤波器在Atom上获得了20倍的速度提升(C vs. SSE2),这高于并行性水平(一次16个像素)。
这取决于架构。目前我假设是x86架构(也称为SSE)。
你可以轻松地在紧密循环中获得四倍的优化。只需用SSE指令替换现有的数学运算即可完成。
甚至可以获得更多的优化,因为如果使用SSE,您可以在寄存器中进行数学运算,而这些寄存器通常不被编译器使用。这将为其他任务(如循环控制和地址计算)释放通用寄存器。简而言之,围绕SSE指令的代码将更加紧凑且执行速度更快。
然后还有一种选项,可以提示内存控制器您希望如何访问内存,例如,如果您希望以绕过缓存的方式存储数据或者不是。对于带宽密集型算法,这可能会给您带来额外的速度提升。