我正在研究一种应该实时运行的流体动力学Navier-Stokes求解器。因此,表现很重要。
现在,我正在研究一些紧密的循环,每个循环占执行时间的很大一部分:没有单一的瓶颈。这些循环中的大多数都进行了一些浮点运算,但是它们之间有很多分支。
浮点运算主要限于加法,减法,乘法,除法和比较。所有这些都是使用32位浮点数完成的。我的目标平台是x86,至少有SSE1指令。 (我在汇编器输出中验证了编译器确实生成了SSE指令。)
我正在使用的大多数浮点值具有相当小的上限,而接近零值的精度不是很重要。所以我想到了这样的想法:也许转换到定点算法会加快速度?我知道唯一可以确定的方法是衡量它,可能需要数天,所以我想事先了解成功的可能性。
固定点在Doom时代风靡一时,但我不确定它在2010年的位置。考虑到现在有多少芯片被用于浮点性能,是否有可能定点算术仍会给我一个显着的速度提升?有没有人有任何可能适用于我的情况的实际经验?
答案 0 :(得分:6)
坚持浮点。固定点实际上只有在8位或16位工作并且使用SIMD时才有用(图像处理和音频是典型的用例)。
现代CPU通常有2个FPU,每个时钟周期最多可以发出2个FP指令。然后,您还可以使用4路FP SIMD(SSE)进行优化。
如果您仍在努力获得良好的性能,请尝试使用更好的编译器,例如Intel的ICC。此外,由于64位模型中的寄存器数量增加,64位英特尔可执行文件往往比32位英特尔可执行文件快一些,因此如果可以的话,可以为64位构建。
当然,您也应该对您的代码进行分析,以便了解热点的确切位置。您没有说明您正在使用的操作系统,但Windows上的VTune,Linux上的Zoom或Mac OS X上的Shark都可以帮助您快速轻松地找到性能瓶颈。
答案 1 :(得分:3)
正如其他人所说,如果你已经在使用浮点SIMD,我怀疑你的定点会有很大改进。
你说编译器正在发出SSE指令,但听起来你并没有尝试编写矢量化的SSE代码。我不知道编译器通常有多好,但这是值得研究的。
另外两个要看的领域是:
内存访问 - 如果所有计算都在SSE中完成,那么缓存未命中可能比实际数学占用更多时间。
展开 - 您应该能够通过展开内部循环获得性能优势。目标不是(尽可能多的人认为)减少循环终止检查的次数。主要好处是允许交错独立指令,以隐藏指令延迟。有一个名为 VMX优化的演示文稿here:提升级别可能会有所帮助;它专注于Xbox360上的Altivec指令,但是一些展开的建议也可能有助于SSE。
正如其他人提到的,个人资料,个人资料,个人资料。然后告诉我们什么仍然缓慢:)
PS - 在你的其他帖子here上,我说服你在矩阵求解器中使用SOR而不是Gauss-Seidel。现在我想一想,你有没有理由不使用三对角线求解器?
答案 2 :(得分:0)
你的机器针对浮点进行了很好的优化,所以你可能不会因为定点分数而节省太多。
你说没有单一的瓶颈,但可能会有多个瓶颈,如果你设法刮掉其中任何一个,那么其他人将占用剩余时间的更大百分比,吸引你的注意力,这样你就可以剃掉它们了太
你可能已经做到了这一点,但是我不仅要确保耗时的功能尽可能快,而且要求它们不仅仅是必要的。