- 主题:软件bug么
和寄存器指令有关最开始。
最开始浮点数都是fpu计算,fpu寄存器都是80bits大小,不管float还是double,没有区别,指令也一样。
后来2000年前后,intel推广sse,引入xmm寄存器,遵从float/double的大小,使用不同的指令。这时的float才是真float。
所以fpu精度高,性能差。sse精度低,但性能高。
从vs2013开始,全部使用sse指令。之前版本x86使用fpu,x64使用sse。
这只是告诉你为啥x86和x64为啥不一致, 至于为何一个是17一个是18就需要看intel实现了。
另外,由于都使用sse,所以尽量用float计算,比double快了很多。
【 在 grainbuds 的大作中提到: 】
: 下面这段代码:
: float a = 1.8;
: int b = 110 * a / 11;
: ...................
--来自微水木3.5.11
--
FROM 140.206.195.*
应该是你那两个数组缓存导致的。
你在测试之前,先用循环把那两个数组赋值一下。
【 在 confinement 的大作中提到: 】
: 求解惑,double 与 float 的运算速度测试,为什么是这样?
: 重复执行4次一样的代码,只有第一次的时候,double与float有明显区别,后面三次区别就很小了
:
: ...................
--来自微水木3.5.11
--
FROM 140.206.195.*
你的代码没有发挥simd的功能。
xmm一次可以装4个float,也就是同时可以进行4个float运算。
而double只能2个。
你把你都测试代码全部改成一次循环计算4个元素。
就能看出显著差异了。
【 在 confinement 的大作中提到: 】
: 每次计时开始之前,加了两行
: memset(result_double, 0, sizeof(result_double));
: memset(result_float, 0, sizeof(result_float));
: ...................
--来自微水木3.5.11
--
FROM 140.206.195.*
直接把i++变成i+=4。循环里面连续计算4个,编译器就会合并计算。
【 在 confinement 的大作中提到: 】
: 这个需要专门的编码方式啊?我不会啊。。。有什么参考书吗?
:
: 【 在 foliver 的大作中提到: 】
: ...................
--来自微水木3.5.11
--
FROM 140.206.195.*