【问题标题】:Is Store Unit Also a Load Unit on an Intel processor?存储单元也是英特尔处理器上的加载单元吗?
【发布时间】:2017-12-16 12:31:42
【问题描述】:

大多数英特尔处理器有 2 个加载单元和 1 个存储单元。 存储单元也是负载单元吗?用于修改现有内存数据的指令/微操作,如inc [memory] 是否仅使用 1 个存储单元,其余 2 个加载单元可用于其他可在相同中执行的微操作/指令循环,或者像inc 这样的指令需要 1 个加载单元(加载现有值)加上 1 个存储单元(存储新值),所以我们只剩下一个加载单元可用?因此,为了保持 2 个负载单元可用,我们可以纯粹存储 mov、push 等指令?

【问题讨论】:

  • 我认为这可能取决于微架构。不过,我不确定。
  • inc 指令在 Skylake 上被解码为四个微指令:一个必须进入端口 0、1、5 或 6(这是加法操作),一个必须进入端口 4 (这是存储操作)和端口 2,3 或 7 中的两个(这是 AGU 和加载操作)。 (Source Fog 的表格)。所以我相信 RMW 指令按照直觉建议使用加载和存储单元。

标签: assembly x86-64 intel cpu-architecture instructions


【解决方案1】:

内存读取-修改-写入指令是 Intel P6 系列或 Sandybridge 系列上的至少 4 个非融合域微指令。 (如果需要超过 1 个 ALU uop,可能会更多)

没有要求它们中的任何一个都在同一个周期中执行,您的问题的措辞似乎是假设的。在加载使用延迟期间允许乱序执行执行其他工作是将 x86 指令解码为内部类似 RISC 的微指令的主要好处之一。

您可以在Agner Fog's instruction tables 中查看更多详细信息。查阅他的微架构 pdf 以了解更多关于这意味着什么。对于我在此答案中未解释的任何内容,您可以在其中找到详细信息。

对于 Intel Haswell 上的 inc dword [rdi],这些是微指令(以及它们可以运行的端口):

  • 加载dword [rdi] (p2/p3),取决于rdi
  • ALU inc (p0/p1/p5/p6),取决于来自负载的数据
  • store-address [rdi] (p2/p3/p7),取决于rdi(但不是加载的数据,我认为)
  • 我认为,store-data (p4) 将 ALU 结果复制到存储缓冲区中,这取决于 ALU 和存储地址 uops。

请注意,只有简单的寻址模式([reg] 或 [reg + constant])可以使用端口 7 上的 AGU,但它们仍然可以发送到 p2 或 p3 并窃取负载吞吐量。其他存储寻址方式只能使用p2/3。加载 uops 到 p2 或 p3,并使用 AGU,但也是执行单元的加载数据部分。

这种不完美的调度可以并且确实会影响持续的 L1D 带宽:英特尔的优化手册表明,尽管 Skylake-S 中的 峰值 L1D 带宽是 64B 读取和 32B 写入单个周期,持续带宽最多为每个周期约 81B。 (Table 2-4. Cache Parameters of the Skylake Microarchitecture on page 36)

inc [mem] 肯定要运行加载微指令。请参阅Can num++ be atomic for 'int num'? 了解有关读取-修改-写入操作如何工作的更多详细信息(带/不带lock 前缀)。 CPU 不能只向 DRAM 或缓存​​发送“增量”命令,然后让操作发生在“内存中”。


计算 uops 与端口对于循环或长代码序列中的吞吐量更有意义。您无法知道哪些微指令将在相同的周期中彼此​​执行,除非它们都在等待相同的输入准备就绪。然后,您可以预测,如果没有足够的执行端口供 uop 并行运行(这称为资源冲突),则最旧的 uop 将首先运行。因此,最好先将指令放在关键路径上,以减少资源冲突造成的延迟。

特定端口上的执行端口瓶颈只是三种常见的 uop 吞吐量之一。另外两个是:

  • 限制可用的延迟/依赖链ILP
  • 每个时钟 4 个融合域 uops 的前端限制,而不是任何特定端口上的非融合域压力。 (或者在 Ryzen 上为 5 个,在运行多指令时为 6 个)。

因此,除了缓存未命中和分支错误预测之外,一系列指令对周围独立工作的影响大致可以通过其延迟、融合域微指令计数和每个端口的微指令来表征。


为了节省前端解码和发布带宽,其中一些微指令可以微融合在一起。 (或者 AMD CPU 从来没有把它们分开,直到它们到达执行单元)。有关微融合的更多信息,另请参阅Micro fusion and addressing modes。 (我对该答案有一个未完成的更新,它添加了对微融合的独立描述,以将所有内容放在一个地方,因为 Agner Fog 的指南省略了非分层,而英特尔的优化手册没有提到 HSW,后来没有在 SnB 的情况下总是不层压。)

inc dword [rsi] 在 Sandybridge-family 上只能将 store-address + store-data uop 融合在一起,因此解码为 3 个fused-domain uop。

add dword [rsi], 1 可以将负载与 ALU add uop 融合,因此问题阶段从 IDQ 读取并添加到 ROB 中只有 2 个融合域 uop。它仍然扩展为 4 个未融合域 uop,以分配给端口并添加到调度程序(又名预留站)。 (是的,在 Intel CPU 中,微指令在发布时分配给端口)。

请注意,add 设置的标志与inc 不同,因此它们无法解码为完全相同类型的内部微指令。据推测,英特尔认为让add uops 融合负载是值得的,因为像add eax, [rsi] 这样的指令很常见。但是inc + 负载融合只能作为inc [mem] 的一部分发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2016-01-27
    • 1970-01-01
    • 2011-01-08
    • 2015-01-31
    • 2011-10-15
    相关资源
    最近更新 更多