我在CFD求解器中使用IEEE严格浮点运算。我的算法是显式的和确定性的(它将在每个时间步执行完全相同的计算次数)。然而,我观察到在解决方案很复杂的时期(整个网格中发生了很多事情),求解器“陷入困境”并且变慢。
我对FP算术非常敏感,因此假设FP算法在其计算时间上是确定性的。现在我开始怀疑给定FP计算所需的实际CPU操作数是否可以取决于值(例如,乘法或除法的指数强烈不同)。
IEEE严格的浮点性能是否取决于值?
答案 0 :(得分:1)
虽然可以设计浮点硬件,其任何特定操作的执行速度将独立于操作数的值,但通常有利的是最小化平均情况时间,特别是如果可以的话在不影响最坏情况时间的情况下完成。例如,即使芯片通常需要六个周期来执行双精度浮点乘法,如果在芯片开始乘法过程的同时,单独的电路执行以下操作,则可以提高许多应用中的性能:
Set R1 if first operand is NaN or second operand is +/- 1.0
Set R2 if second operand is NaN or first operand is +/- 1.0
Set Z if either operand is +/- 0.0
Set N if either operand is NaN
If (R1 or R2 or Z)
Set the body of the result, excluding sign, to the (first-op & R1) | (second-op & R2)
Set the sign of the result to (first-op & (R1 | !N)) ^ (second-op & (R2 | !N))
Skip the rest of the multiplication
添加上述逻辑会导致浮点乘以+/- 1.0或+/- 0.0,以便在不涉及此类常数的乘法所需的六分之一时间内执行。在许多情况下,代码接受任意缩放因子,但最常用于缩放因子为零或一;例如,某些图形应用程序可能允许任意缩放,旋转和剪切,但最常使用的是比例因子为1,无旋转,无剪切。尽管需要的硬件数量少于通过一个周期改进大多数乘法所需的硬件,但加速乘以零和一,可以在许多情况下提供更有用的性能提升。