社区
数据结构与算法
帖子详情
float 与 __int64 及 int 的四则运算速度会有多大差别?
bfbd
2003-02-27 09:50:21
我可以在VC中看到相对应的汇编码,
但却查不到相应指令所占用的CPU时钟周期。
哪位高手给指点一二。
尤其是float和__64之间的比较。
...全文
1217
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 和点云的取值范围
本文介绍了不同操作系统下
int
、long等整型变量及
float
、double等浮点型变量的字节占用、取值范围及应用区别,并探讨了它们在激光雷达点云数据处理中的适用性。
混合精度训练说明
本文介绍了混合精度训练,通常训练中模型数据默认是torch.
float
32类型,占用内存多、计算量大、训练慢。适当降低精度,如降到TF32、B
FLOAT
16,可减少计算量、降低内存占用,从而提升性能。还介绍了不同精度数据TF32和B
FLOAT
16的特点及使用方法。
Wide Research:多Agent协同研究系统架构与工程实践
本文详细阐述Wide Research多Agent协同研究系统的架构设计与工程实践,聚焦于解决海量信息场景下的研究效率与准确性瓶颈。系统采用三层架构:智能分工层实现任务动态切片与角色化分发;协同校验层基于信源权重与证据链进行交叉验证;持续进化层通过模式抽象实现领域自适应优化。关键技术包括Agent角色定义、输入净化门、执行沙箱与输出校验网等Guardrails机制,并依托Celery+Redis实现水平扩展,PostgreSQL统一状态管理。系统已在真实竞品分析场景中验证:1023个网页处理耗时22分钟,准确率达91.2%,失败率低于0.3%。
C++基本数据类型的两个小知识点
本文探讨了C++中整型数据类型(short、
int
、long、long long)的长度规则,强调了'至少'的含义,即在不同平台上保证的最小长度。同时,介绍了单精度
float
和双精度double的内存占用、表示范围及其精度差异。在
64
位操作系统中,整型长度可能因平台而异,而
float
和double的长度则是固定的。理解这些基础知识对于优化代码和提高效率至关重要。
PyTorch → Quantize → ONNX → TensorRT Engine 流程总结与现代llm的
差别
本文系统梳理PyTorch模型经Post-Training Quantization(PTQ)、ONNX导出、TensorRT Engine编译的端到端部署流程,重点解析量化路径(A/B)、Parser与Builder分工、Q/DQ融合机制及tactic搜索原理;同时对比LLM场景下TRT-LLM不依赖ONNX的专用编译路径,涵盖Unified Checkpo
int
、KV Cache实现、Paged Memory、Continuous Batching及端侧优化(Vocab Reduction、FP8 Embedding)等核心技术。
数据结构与算法
33,025
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章