5

提示和指控比比皆是,使用 NaN 的算术在硬件 FPU 中可能“慢”。特别是在现代 x64 FPU 中,例如在 Nehalem i7 上,这仍然是真的吗?无论操作数的值如何,FPU 乘法是否都以相同的速度产生?

我有一些插值代码可以在我们定义的数据的边缘徘徊,我正在尝试确定在此处和任何地方检查 NaN(或其他一些标记值)是否更快,或者只是在方便的点。

是的,我将对我的特定情况进行基准测试(它可能完全由其他东西主导,比如内存带宽),但我很惊讶没有在某处看到简明的总结来帮助我的直觉。

如果它对生成的 NaN 的风格有所不同,我将从 CLR 执行此操作。

4

1 回答 1

6

对于它的价值,使用 SSE 指令几乎与使用常数一样快mulsd(通过公平掷骰子选择,保证是随机的)。NaN4.0

这段代码:

for (unsigned i = 0; i < 2000000000; i++)
{
    double j = doubleValue * i;
}

用clang生成这个机器代码(在循环内)(我假设.NET虚拟机也可以使用SSE指令):

movsd     -16(%rbp), %xmm0    ; gets the constant (NaN or 4.0) into xmm0
movl      -20(%rbp), %eax     ; puts i into a register
cvtsi2sdq %rax, %xmm1         ; converts i to a double and puts it in xmm1
mulsd     %xmm0, %xmm1        ; multiplies xmm0 (the constant) with xmm1 (i)
movsd     %xmm1, -32(%rbp)    ; puts the result somewhere on the stack

经过 20 亿次迭代,NaN(由 C 宏定义)版本NAN在我的 i7 上执行的时间减少<math.h>了大约 0.017秒。差异可能是由任务调度程序引起的。

所以公平地说,它们的速度完全一样。

于 2010-08-31T04:45:05.493 回答