社区
数据结构与算法
帖子详情
float 与 __int64 及 int 的四则运算速度会有多大差别?
bfbd
2003-02-27 09:50:21
我可以在VC中看到相对应的汇编码,
但却查不到相应指令所占用的CPU时钟周期。
哪位高手给指点一二。
尤其是float和__64之间的比较。
...全文
1247
20
打赏
收藏
float 与 __int64 及 int 的四则运算速度会有多大差别?
我可以在VC中看到相对应的汇编码, 但却查不到相应指令所占用的CPU时钟周期。 哪位高手给指点一二。 尤其是float和__64之间的比较。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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时钟周期都是珍贵的。
int
和 long
int
float
以及 double 和点云的取值范围
早期的操作系统是16位系统,
int
用二字节表示,范围是-32768~32767; long用4字节表示,范围是-2147483
64
8~2147483
64
7。 后来发展到32位操作系统,
int
用4字节表示,与long相同。 目前的操作系统已发展到
64
位操作系统,但因程序编译工艺的不同,两者表现出不同的
差别
: 32位编译系统:
int
占四字节,与
Erlang/OTP 的 Emacs 编程利器:Erlang mode 参考手册与实践指南
本篇技术指南系统梳理 Erlang/OTP 发行版中随 tools 应用一同发布的 **Erlang mode for Emacs** 的完整功能面:从缩进、注释填充、代码移动与标记、对齐、语法高亮,到 Tags 导航、代码骨架(Skeleton)、内置 Erlang Shell、编译与错误跳转、Man 手册浏览以及 IMenu 集成。本文以 [lib/tools/doc/references/e
浮点数存储原理与IEEE 754标准详解:从内存视角解析
float
/double
浮点数是计算机中表示实数的一种近似方法,其核心原理基于二进制科学计数法。IEEE 754标准定义了浮点数在内存中的存储格式,将数据分为符号位、指数位和尾数位三部分,通过规格化处理和偏置编码实现高效存储与计算。这种设计在工程上平衡了精度、范围和性能,使得浮点数能够表示极大和极小的数值,同时保持相对较高的运算效率。在编程实践中,浮点数广泛应用于科学计算、图形渲染、物理仿真和机器学习等领域,但需要注意其固有的精度限制和舍入误差。理解浮点数的内存表示有助于避免常见的比较错误和累积误差问题,特别是在处理金融计算或需要
STM32上YOLO-FastestV2
INT
8量化后边界框错乱与误检排查指南
在资源受限的MCU上部署目标检测模型,
INT
8量化是提升推理
速度
的关键手段,但量化后常出现边界框错乱、误检增多等问题。这些现象往往并非编译器缺陷,而是部署链路中输出张量布局变化、后处理解码精度不足、量化标定数据代表性差以及输入预处理不一致等环节所致。理解从ONNX到
INT
8的模型转换原理,掌握固定小数点反量化、anchor对齐和敏感层定位方法,能有效缩短排障路径。本文以STM32N6570-DK上运行YOLO-FastestV2为例,系统梳理了量化后处理与调优的工程实践,帮助开发者在嵌入式AI应用中快速定位
复古主机游戏开发:单文件物理引擎如何适配N
64
、PSX与Dreamcast
物理引擎是游戏开发中不可或缺的底层模块,现代引擎几乎都内置了成熟的物理系统,但在N
64
、PSX、Dreamcast这类二十多年前的复古主机上,硬件资源极度受限——PSX甚至没有浮点单元,主流物理库根本无法落地。单文件物理引擎提供了一种复古又现代的工程解法:用纯C语言在单个头文件中实现AABB碰撞检测、固定步长积分等最小物理核心,省去复杂依赖,能直接集成进libdragon、PSn00bSDK和KallistiOS等Homebrew工具链。这种设计在降低构建成本、提升代码可审查性的同时,也便于针对PSX无FP
数据结构与算法
33,026
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章