Seb*_*ood 5 clr 64-bit nan fpu
提示和指控比比皆是,使用NaN的算法在硬件FPU中可能"慢".特别是在现代的x64 FPU中,例如在Nehalem i7上,这仍然是真的吗?无论操作数的值如何,FPU乘法都会以相同的速度进行转换?
我有一些插值代码可以离开我们定义的数据的边缘,我正在尝试确定在那里和任何地方检查NaN(或其他一些哨兵值)是否更快,或者只是在方便的点.
是的,我将对我的特定情况进行基准测试(它可能完全由其他东西支配,比如内存带宽),但我很惊讶没有看到一个简洁的摘要来帮助我的直觉.
我将从CLR中做到这一点,如果它对生成的NaN的味道有所不同.
对于它的价值,使用SSE指令mulsd
与NaN
几乎是完全一样快,随着不断的4.0
(由一个公平的骰子,保证是随机选择).
这段代码:
for (unsigned i = 0; i < 2000000000; i++)
{
double j = doubleValue * i;
}
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
并有两个十亿的迭代中,NaN
(由C宏定义NAN
从<math.h>
版本)历时约0.017 少秒对我的i7处理器执行.差异可能是由任务调度程序引起的.
所以公平地说,它们一样快.
归档时间: |
|
查看次数: |
621 次 |
最近记录: |