gpt4 book ai didi

assembly - 代表回复 : why all the hassle?

转载 作者:行者123 更新时间:2023-12-01 09:49:54 28 4
gpt4 key购买 nike

repz ret的问题已在此处介绍 [ 1 ] 以及其他来源 [ 2 , 3 ] 相当满意。但是,没有阅读这些来源,我找到了以下答案:

  • ret 进行定量比较的实际惩罚是多少?或 nop; ret ?特别是在后一种情况下——当大多数函数要么有 100 多个指令要么被内联时,解码一个额外的指令(和一个空的指令!)真的很重要吗?
  • 为什么这个问题从未在 AMD K8 中得到修复,甚至进入了 K10?既然什么时候记录基于行为的丑陋解决方法,而不是实际解决问题,那么当原因的每个细节都知道时?
  • 最佳答案

    分支预测错误
    所有喧嚣的原因是分支错误预测的成本。
    当分支出现时,CPU 预测采用的分支并在管道中预加载这些指令。
    如果预测错误,则需要清除流水线并加载新指令。
    这最多可能需要 number_of_stages_in_pipeline周期加上从缓存加载数据所需的任何周期。每次错误预测 14 到 25 个周期是典型的。

    原因:处理器设计
    K8 和 K10 受此影响的原因是 AMD 的出色优化。
    AMD K8 和 K10 将预解码缓存中的指令并跟踪它们在 CPU L1 指令缓存中的长度。
    为了做到这一点,它有额外的位。

    For every 128 bits (16 bytes) of instructions there are 76 bits of additional data stored .

    下表详细说明了这一点:

    Data             Size       Notes
    -------------------------------------------------------------------------
    Instructions 128 bits The data as read from memory
    Parity bits 8 bits One parity bit for every 16 bits
    Pre-decode 56 bits 3 bits per byte (start, end, function)
    + 4 bit per 16 byte line
    Branch selectors 16 bits 2 bits for each 2 bytes of instruction code

    Total 204 bits 128 instructions, 76 metadata

    由于所有这些数据都存储在 L1 指令缓存中,因此 K8/10 cpu 必须在解码和分支预测上花费更少的工作。这节省了硅。
    而且由于 AMD 的晶体管预算不如英特尔,因此它需要更智能地工作。

    但是,如果代码是 esp。紧跳转和 ret 可能占用相同的两个字节槽,这意味着 RET被预测为未采取(因为跟随它的跳跃是)。
    通过使 RET 占用两个字节 REP RET这永远不会发生,并且总是可以预测 RET。

    英特尔没有这个问题,但(过去)受到有限数量的预测槽的影响,而 AMD 则没有。

    nop ret
    永远没有理由这样做 nop ret .这是两条指令,浪费了额外的周期来执行 nopret可能仍然与跳跃“配对”。
    如果要对齐,请使用 REP MOV代替或使用 multibyte nop .

    闭幕词
    只有本地分支预测与指令一起存储在缓存中。
    还有一个单独的全局分支预测表。

    关于assembly - 代表回复 : why all the hassle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39863255/

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