gpt4 book ai didi

performance - 在循环中插入 nop 以及在 movnti 商店附近阅读时意外减速

转载 作者:行者123 更新时间:2023-12-03 16:15:27 26 4
gpt4 key购买 nike

  • 我不明白为什么第一个代码每次迭代有 ~1 个周期,而第二个代码每次迭代有 2 个周期。我用 Agner 的工具和性能进行了测量。根据 IACA,从我的理论计算来看,它也应该需要 1 个周期。

  • 每次迭代需要 1 个周期。
    ; array is array defined in section data
    %define n 1000000
    xor rcx, rcx

    .begin:
    movnti [array], eax
    add rcx, 1
    cmp rcx, n
    jle .begin

    每次迭代需要 2 个周期。 但为什么?
    ; array is array defined in section data
    %define n 1000000
    xor rcx, rcx

    .begin:
    movnti [array], eax
    nop
    add rcx, 1
    cmp rcx, n
    jle .begin

    这个最终版本每次迭代需要大约 27 个周期。但为什么?毕竟,没有依赖链。
    .begin:
    movnti [array], eax
    mov rbx, [array+16]
    add rcx, 1
    cmp rcx, n
    jle .begin

    我的 CPU 是 IvyBridge。

    最佳答案

    movnti根据 Agner Fog's tables,是 2 uop,并且不能微型 fuse 对于 Ivy 桥。

    因此,您的第一个循环是 4 个融合域 uops,并且可以在每个时钟进行一次迭代。
    nop是第 5 个融合域 uop(即使它不采用任何执行端口,因此它是 0 个未融合域 uops)。这意味着前端每 2 个时钟只能发出一个循环。

    另见 标记 wiki 以获取有关 CPU 工作原理的更多链接。

    第三个循环可能很慢,因为 mov rbx, [array+16]可能正在从 movnti 的同一缓存行加载驱逐。每次刷新它存储的填充缓冲区时都会发生这种情况。 (不是每个 movnti ,显然它可以在同一个填充缓冲区中重写一些字节。)

    关于performance - 在循环中插入 nop 以及在 movnti 商店附近阅读时意外减速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37101644/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com