作者:窝巢哥_809 | 来源:互联网 | 2023-01-29 19:35
大多数英特尔处理器都有2个负载单元和1个存储单元.商店单位也是一个负载单位吗?指令/微操作是修改现有的存储器数据,例如inc [memory]
只使用1个存储单元,其余2个负载单元可用于可在相同周期内执行的其他微操作/指令,或者指令如inc
1个负载单元(加载现有值)加1个存储单元(存储新值)所以我们只剩下一个加载单元?因此,保持2个负荷单位供选择,我们就可以完全存储指令一样mov
,push
等?
1> Peter Cordes..:
内存读取 - 修改 - 写入指令在Intel P6系列或Sandybridge系列上至少有4个非融合域uop.(如果需要超过1个ALU uop,可能会更多)
没有要求它们中的任何一个在同一个循环中执行,你的问题的措辞似乎是假定的.允许乱序执行在负载使用延迟期间执行其他工作是将x86指令解码为内部RISC类uop的主要好处之一.
您可以在Agner Fog的说明表中查看更多详细信息.请参阅他的微体系结构pdf,以了解更多有关这意味着什么的信息.对于我在这个答案中没有解释的任何内容,你可以在那里找到详细信息.
对于inc dword [rdi]
Intel Haswell,这些是uops(以及它们可以运行的端口):
加载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.(表2-4.Skylake微体系结构的缓存参数第36页)
inc [mem]
肯定要运行负载uop.请参阅'num num'可以将num ++设为原子?有关read-modify-write操作如何工作的更多详细信息(带/不带lock
前缀).CPU不能只向DRAM或缓存发送"增量"命令,并使操作"在内存中"发生.
计算uops与端口对循环中的吞吐量或长序列代码更有意义.您无法知道哪些uop将在相同的周期内执行,除非他们都在等待相同的输入准备就绪.然后,如果uops没有足够的执行端口并行运行,则可以预测最早的uop将首先出现(这称为资源冲突).因此,最好先将指令放在关键路径上,以减少资源冲突造成的延迟.
特定端口上的执行端口瓶颈只是三种常见uop吞吐量中的一种.另外两个是:
延迟/依赖链限制可用的ILP
每个时钟4个融合域uop的前端限制,而不是任何特定端口上的未融合域压力.(或Ryzen上5,运行多uop指令时6).
因此,除了缓存未命中和分支错误预测之外,一系列指令对周围独立工作的影响可以粗略地表征其延迟,融合域uop计数和每个端口的uop.
为了节省前端解码和发布带宽,其中一些微操作可以微融合在一起.(或者AMD CPU从未将它们分开,直到它们到达执行单元).有关微融合的更多信息,请参见微融合和寻址模式.(我对该答案有一个未完成的更新,它添加了一个独立的微融合描述,将所有内容放在一个地方,因为Agner Fog的指南省略了无分层,英特尔的优化手册没有提到HSW,后来也没有在SnB的情况下,总是没有层压.)
inc dword [rsi]
只能将商店地址+商店数据uop融合在Sandybridge系列上,因此它解码为3个融合域 uop.
add dword [rsi], 1
可以将负载与ALU add
uop融合,因此在IDQ读取并添加到ROB时,问题阶段只有2个融合域uop.它仍然扩展到4个未融合的域uop,分配给端口并添加到调度程序(也称为Reservation Station).(是的,在Intel CPU中发布时将uops分配给端口).
请注意,add
设置标志不同inc
,因此它们无法解码为完全相同的内部uop.据推测,英特尔决定让add
uops融合负载是值得的,因为这样的指令add eax, [rsi]
很常见.但inc
+负载融合只能作为一部分发生inc [mem]
.