【发布时间】:2011-02-09 16:15:33
【问题描述】:
我正在研究一种应该实时运行的流体动力学 Navier-Stokes 求解器。因此,性能很重要。
现在,我正在研究许多紧密循环,每个循环都占执行时间的很大一部分:没有单一的瓶颈。这些循环中的大多数都执行一些浮点运算,但中间有很多分支。
浮点运算大多限于加法、减法、乘法、除法和比较。所有这些都是使用 32 位浮点数完成的。我的目标平台是至少带有 SSE1 指令的 x86。 (我已经在汇编器输出中验证了编译器确实会生成 SSE 指令。)
我正在使用的大多数浮点值都有一个相当小的上限,接近零值的精度并不是很重要。所以我想到了:也许切换到定点算术可以加快速度?我知道真正确定的唯一方法是衡量它,这可能需要几天时间,所以我想事先知道成功的几率。
定点在 Doom 时代风靡一时,但我不确定它在 2010 年的表现如何。考虑到现在有多少硅被注入到浮点性能中,定点是否有机会算术仍然会给我带来显着的速度提升吗?有没有人有任何可能适用于我的情况的实际经验?
【问题讨论】:
-
分支可能是最大的性能杀手。尽量减少它。不,不要做定点。
-
我发现相反。在某些情况下,我可以用更多的浮点运算来代替分支,但这会减慢速度。
-
回过头来,我过去使用过专门的定点 SIMD 硬件,真是头疼!关于重新考虑定点算术,我会三思而后行。你想把大部分时间花在处理复杂的定点算术上,还是解决更大的问题上?今天的 CPU 包含更多的功能,并且包含 FPU——我会选择浮点解决方案。与其考虑定点算法,不如花时间尝试保持管道满载。
-
另外:向 MIMD 解决方案添加几个计算节点比调整定点 SIMD 解决方案的代码更容易..
-
另外:必须处理精确的值是一个巨大的痛苦——你不想去那里
标签: performance floating-point x86 fixed-point