V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iqoo
V2EX  ›  程序员

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

  •  
  •   iqoo · 2023-05-16 17:54:43 +08:00 · 1353 次点击
    这是一个创建于 560 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    9 条回复    2023-05-17 09:02:26 +08:00
    tool2d
        1
    tool2d  
       2023-05-16 18:02:29 +08:00
    随手写个 benchmark ,自己测试一下呗。

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

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

    对于有硬件 idiv 支持的的微架构,延迟和吞吐看起来不受输入数据影响。
    感觉区别不算很大吧。
    至于能否隐藏延迟还是要看你具体的 workload 情况,自己测测。
    opengps
        5
    opengps  
       2023-05-16 18:40:26 +08:00
    虽然可能有关系,但这得多大的量才能把这个优势体现出来呢?
    rrfeng
        6
    rrfeng  
       2023-05-16 18:55:13 +08:00
    64 位架构上不是 64 位更快么?
    secondwtq
        7
    secondwtq  
       2023-05-16 19:16:20 +08:00   ❤️ 1
    硬件实现整数除法具体的算法我不清楚,但是网上大致也可以查到,比如这个
    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
        8
    secondwtq  
       2023-05-16 19:17:21 +08:00
    @secondwtq 贴错了,倒数第二个 URL 是这个: https://www.v2ex.com/t/845257
    lisxour
        9
    lisxour  
       2023-05-17 09:02:26 +08:00
    @opengps 哈哈,夸张到连乘数法运算都要优化。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5367 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:30 · PVG 17:30 · LAX 01:30 · JFK 04:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.