代码之家  ›  专栏  ›  技术社区  ›  Sebastian Good

Intel x64 FPU中的NaN算法有多慢?

  •  5
  • Sebastian Good  · 技术社区  · 14 年前

    大量的暗示和指控表明,在硬件FPU中,使用NAN的算法可能会“慢”。特别是在现代x64 FPU中,例如在Nehalem i7上,这仍然是真的吗?不管操作数的值是多少,FPU乘法是否以相同的速度生成?

    我有一些插值代码,可以偏离我们定义的数据的边缘,我正在尝试确定在这里和任何地方检查nan(或其他一些sentinel值)是更快,还是只是在方便的点上。

    我将在CLR中执行此操作,如果它对生成的NAN的味道有影响的话。

    1 回复  |  直到 14 年前
        1
  •  6
  •   zneak    14 年前

    为了它的价值,使用SSE指令 mulsd NaN 几乎和常数一样快 4.0 (由公平的骰子选择,保证是随机的)。

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

    生成带有叮当声的机器代码(在循环内)(我假设.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亿次迭代 (由C宏定义) NAN <math.h> 较少的 在我的i7上执行秒数。这种差异可能是由任务调度程序造成的。

    公平地说,他们也一样快。

    推荐文章