整数长度是否会影响除法性能?

2023-05-16 17:54:43 +08:00
 iqoo

程序中有个变量需频繁除法和取模计算。该变量虽然是运行时动态获取的,但值可确定 u32 足以容纳。如果定义成 u64 ,是否会影响计算性能?

目标系统是 intel 或 arm ,但都是 64 位系统。

1373 次点击
所在节点    程序员
9 条回复
tool2d
2023-05-16 18:02:29 +08:00
随手写个 benchmark ,自己测试一下呗。

我以前认为乘除要比加减计算费时,但用 SSE 优化指令测试了一下,好像也没拉开明显差距。

现在 CPU 比以前好多了,计算只要能并行,速度就够快。
pkoukk
2023-05-16 18:02:33 +08:00
跑个 benckmark 呗,我用 golang 测试,u32 大概比 int64 慢不到 2%
pkoukk
2023-05-16 18:02:59 +08:00
@pkoukk 口误,快 2%
misdake
2023-05-16 18:37:19 +08:00
x86 微架构层面的性能差别:
https://uops.info/html-instr/IDIV_R64.html
https://uops.info/html-instr/IDIV_R32.html

对于有硬件 idiv 支持的的微架构,延迟和吞吐看起来不受输入数据影响。
感觉区别不算很大吧。
至于能否隐藏延迟还是要看你具体的 workload 情况,自己测测。
opengps
2023-05-16 18:40:26 +08:00
虽然可能有关系,但这得多大的量才能把这个优势体现出来呢?
rrfeng
2023-05-16 18:55:13 +08:00
64 位架构上不是 64 位更快么?
secondwtq
2023-05-16 19:16:20 +08:00
硬件实现整数除法具体的算法我不清楚,但是网上大致也可以查到,比如这个
stackoverflow.com/questions/71420116/why-is-there-only-little-difference-in-integer-division-throughput-with-larger-v performance - Why is there only little difference in integer division throughput with larger values on AMD Zen? - Stack Overflow
但是总的来说整数除法比乘法的算法要复杂得多,并且似乎只能一点点算,所以不同长度有可能有可见的区别,并且一般较老的硬件问题更严重:
https://uops.info/table.html?search=idiv%20r&cb_lat=on&cb_tp=on&cb_uops=on&cb_ports=on&cb_SKL=on&cb_ADLP=on&cb_ADLE=on&cb_ZEN2=on&cb_ZEN3=on&cb_measurements=on&cb_doc=on&cb_base=on
另一个相关的问题是浮点 SIMD 除法,部分硬件上性能也可能和向量长度相关(很少有架构提供 SIMD 整除指令,一般都是用软件实现):
https://uops.info/table.html?search=vdivp&cb_lat=on&cb_tp=on&cb_uops=on&cb_ports=on&cb_SKL=on&cb_ADLP=on&cb_ADLE=on&cb_ZEN2=on&cb_ZEN3=on&cb_ZEN4=on&cb_measurements=on&cb_doc=on&cb_base=on&cb_avx=on&cb_avx2=on&cb_avx512=on

一个特例是除数为整数的整数除法,编译器会做优化,避免使用硬件除法器:
https://v2ex.com/t/933790#r_12971302
如果楼主的程序是这种情况一般性能会更好。不过我没有研究过这个在不同长度下的性能表现,楼主可以写个小 case 扔进 uiCA/llvm-mca 里面试试

当然最吼的还是都 profile 试试,这个除法操作是不是瓶颈:
https://v2ex.com/t/933790 https://v2ex.com/t/828141
secondwtq
2023-05-16 19:17:21 +08:00
@secondwtq 贴错了,倒数第二个 URL 是这个: https://www.v2ex.com/t/845257
lisxour
2023-05-17 09:02:26 +08:00
@opengps 哈哈,夸张到连乘数法运算都要优化。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/940488

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX