float 与 __int64 及 int 的四则运算速度会有多大差别?

bfbd 2003-02-27 09:50:21
我可以在VC中看到相对应的汇编码,
但却查不到相应指令所占用的CPU时钟周期。
哪位高手给指点一二。
尤其是float和__64之间的比较。

...全文
876 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuiyuting 2003-03-10
  • 打赏
  • 举报
回复
……
不是的,
float的fdiv是d8...
double的fdiv是dc...
intel给的文档上,float也要比double快
一个是23 23,一个是38 38(但是不包括读内存的时间)
另外,执行时间也是可以计算的
对P4的内核来说,它有4个执行端口,每个端口对应几个不同的执行单元
在每个时钟周期里,每个端口根据对应的执行单元,可以接受某些微指令(mu-op),一般是1-2条。
而每条指令都有一个占用执行单元的时间和占用端口的时间(端口可以再次接受这个指令的间隔),根据这个,一般就能估算出指令的执行周期(当然还要加上cache失效,总线io的时间)详细的请参见intel p4&xeon processor optimization reference manual(不过按intel的惯例,这里面应该有些东西是不准的,谁要是有兴趣的话,可以写个勘误表出来:P)
bfbd 2003-03-03
  • 打赏
  • 举报
回复
--mult--
Calc Start.INT Start...
start int: _01_16_%_
end int : _01_22_%_
INT End : 6''

INT64 Start...
start int64: _01_22_%_
end int64 : _01_45_%_
INT64 End : 23''

FLOAT Start...
start float: _01_45_%_
end float : _01_51_%_
FLOAT End : 6''

Double Start...
start Double: _01_51_%_
end Double : _01_57_%_
Double End : 6''
Calc End.

--div--
Calc Start.INT Start...
start int: _04_44_%_
end int : _05_12_%_
INT End : 28''

INT64 Start...
start int64: _05_12_%_
end int64 : _06_37_%_
INT64 End : 1'25''=85''

FLOAT Start...
start float: _06_37_%_
end float : _07_14_%_
FLOAT End : 37''

Double Start...
start Double: _07_14_%_
end Double : _07_50_%_
Double End : 36''
Calc End.

居然,居然...
看来真是实践出真知阿!
我原本以为,无论如何整型运算都会比浮点运算要快,看来流行的看法未必是对的。

不过我还有一点不明白:
为什么double和float所使用的都是一下三句汇编代码,
难道double不需要将高四位和低四位分开计算吗?
--float--
00402397 fld dword ptr [ebp-48h]
0040239A fdiv dword ptr [ebp-4Ch]
0040239D fstp dword ptr [ebp-50h]
--double--
004024B8 fld qword ptr [ebp-58h]
004024BB fdiv qword ptr [ebp-60h]
004024BE fstp qword ptr [ebp-68h]

是不是这几句浮点指令设计时就是针对double进行运算和优化的,只是兼容了float的运算。
传入不同参数就得到不同的运算?
看来汇编的用处还是大大地,一到了系统优化的关键时刻,就得看真功夫了。

另外:感谢楼上各位的精彩回答。
大家都有分。


Cybergate 2003-03-03
  • 打赏
  • 举报
回复
mark

不错,时代在变,现在的FPU已经很成熟了,我的老观念也要改一改了。
dbExpress 2003-03-01
  • 打赏
  • 举报
回复
看matche大老的帖子真爽
mathe 2003-03-01
  • 打赏
  • 举报
回复
1.在奔腾系列中,double的运算数度要比float快,所以除非是为了节省内存空间或则使用SIME指令,没有必要使用float类型。同样适用int类型比__int64,short或char类型都快。
2.只要没有相互依赖关系,不同类型的指令是可以可以并行执行的(相同类型的指令也可以并行执行,比如奔腾系列中,至少都有两个浮点单元),现在的CPU的处理单元数目都较多,只察看单条指令的CPU时间意义并不高。
3.定点运算还有一个优势是编译器可以将数乘转化为移位运算,从而可以极大提高运算数度:如x*5可以转化为(x<<2)+x.
4.现在的CPU非常复杂,编译器对性能的影响非常大,使用一个好的编译器可以对性能有极大的提高。
在你的例子中将float和__int64作比较,说明你对计算结果的精度要求不高,但是数据变化的范围较大,说明这些数据本身就具有浮点数据的特点,建议使用double型。不然,你应该找一个支持SIME指令的编译器(如Intel C/C++ Compiler),然后根据编译器的一些文档中的建议小心修改你的代码(这时应该使用float类型),从而获得更高的速度。
bfbd 2003-02-28
  • 打赏
  • 举报
回复
我测的结果:
CPU:P4 ,1.6G;
执行次数: 10000000000;
执行算式:
int = int / int ; //54''
__int64 = __int64 / int64 ; //84''
float = float / float ; //54''

int = int * int ; //6''
__int64 = __int64 * int64 ; //23''
float = float * float ; //6''

执行期间未作其他操作。
这结果可信吗?如果真是这样,我得选用float.
bfbd 2003-02-28
  • 打赏
  • 举报
回复
我觉得测试程序的结果太不准确了,
未必可信。
我测试的结果是float的除法要比__int64的除法要快很多。

cuiyuting 2003-02-28
  • 打赏
  • 举报
回复
从intel的p4&xeon processor optimization reference manual上找到的
fadd 5 1
fmul 7 2
imul 14 3
add 0.5 0.5
第一个数是执行的时间
第二个数是过多长时间之后,这个指令占用的端口可以再次接收指令
add的0.5表示可以一个时钟周期做两个
bfbd 2003-02-28
  • 打赏
  • 举报
回复
改进算法?
老大,GIS系统可是海量数据,
再怎么改进,基础类型运算也避不开啊!
dbExpress 2003-02-28
  • 打赏
  • 举报
回复
表示最小可以达到10^-38, 最大的可以达到10^+38,但是有效数字只有7,8个比如
1.2345678E38
0.1234567E-38
bfbd 2003-02-28
  • 打赏
  • 举报
回复
float 只能精确到 6-7位?
那10E-38 to 10E+38表示什么意思?
dbExpress 2003-02-28
  • 打赏
  • 举报
回复
10E-38 to 10E+38的38并不是指有效数字,有效数字好像是7、8个
fdiv,fmul的指令周期我不知道,
但是我觉得小菜虎的说法应该有点道理,我是搞pascal的,不知道c,
估计你说的float应该是相当于pascal的single,宽度也就是4个字节,
但是int64是8个字节,而且,float的运算使用硬件FPU,但是int64
则是使用软件模拟的(对于32位编译器来说),float运算比int64快应该
不足为奇。
heishou000 2003-02-28
  • 打赏
  • 举报
回复
float只精确到6-7位,你的系统可能不够用。
bfbd 2003-02-28
  • 打赏
  • 举报
回复
对于经纬度的表示,float足够了:10^-38 ~ 10^38 ;
已经精确到38位了,够了,够了。
Float运算有直接的CPU指令支持:fdiv,fmul
而__int64,要对高低两部分分别处理,所以很慢,
我是这样认为的。
但我还是查不到fdiv,fmul的指令周期。
:(
xiaonian_3654 2003-02-28
  • 打赏
  • 举报
回复
我的书上有介绍,但是不详细,
这个资料不好找,我也在找,
注意进行浮点数运算的是80x87,叫做FPU,
LeeMaRS(想做DP杀手的小菜虎) ,不知道就别说,
不要动不动就说改进算法,
这种数值运算,编译器已经优化的够好了
LeeMaRS 2003-02-28
  • 打赏
  • 举报
回复
我寒.
_int64和float支持的数值范围就不一样, _int64要比float大, 运算是要慢一些的.
看你用不用得着这么大的范围啊.
就像能用整型就不用浮点的道理一样.
strafer 2003-02-27
  • 打赏
  • 举报
回复
一般来说用cpu提供最大字长(整型量)的类型效率最高。还要看你具体解决什么问题了。
Riemann 2003-02-27
  • 打赏
  • 举报
回复
写个小程序检查一下不就行了吗?
LeeMaRS 2003-02-27
  • 打赏
  • 举报
回复
如果是这样的话,我觉得改进算法更重要
bfbd 2003-02-27
  • 打赏
  • 举报
回复
运算次数非常多的计算,
不考虑效率是不行的。
同样的一个运算,如果做
一亿次以上,你认为如何?
所以每一个CPU时钟周期都是珍贵的。

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧