我可以使用四个通用寄存器,例如r8,r9,r10,r11,每个寄存器都有MOV指令用于独立操作,并且印象中CPU在一个时钟内执行所有这些指令吗?
我想知道,因为根据Agner Fog的指令表,它说MOV指令的相对吞吐量是0.25。这意味着CPU应该能够在每个周期执行4个MOV操作。或者我误解了所有??
我是一个菜鸟,并且两个月以来一直在MASM学习装配(主要是为了学习调试寄存器如何工作,这真的很有趣)。
答案 0 :(得分:3)
编辑,重新阅读您的问题,然后您就会询问不同的注册表。我会留下原来的答案;让我们假装你的问题不仅仅是最微不足道的案例。 :P
是的,即使没有寄存器重命名,这些指令也可以在同一周期内执行(在不同的执行单元上),因为它们完全相互独立。
mov eax, 1
mov ebx, ecx
mov edx, [mem]
xor esi,esi ;xor-zero: doesn't even use an execution unit on SnB-family
这是超标量执行的最简单案例。如果eax / rax是所有四条指令的目标,则寄存器重命名仍然允许所有四条指令并行执行。
无序执行允许来自不同依赖链的四个附近指令同时执行,即使它们未在同一时钟周期内被解码或发出。如果他们之间有说明,他们可能也不会在同一个周期退休。 (x86 ISA保证了精确的异常,就像大多数其他ISA(ARM / PPC /等)一样。所有当前的设计都按顺序退出完成。因此,如果一个内存发生了段错误,程序将完全停止该指令,而不仅仅是“好吧,最近有一个段错误,但是我们不能告诉你“。(这将是非精确的例外)。”
像Atom或P5(原版Pentium)这样的超标量有序设计仍然可以利用这四个独立指令中的并行性,但在许多其他情况下却没有。
在手工制作的循环中,SnB系列CPU通常能够在每个周期内维持3个以上的融合域uop。 (由于延迟,在每个周期运行少于一个融合域uop的循环也很容易,更不用说缓存未命中或分支错误预测了。)
是的,对同一架构寄存器的多次写入可以并行执行。注册重命名不是英特尔或AMD设计的瓶颈。
要理解并充分利用Agner Fog的表格,您必须阅读his microarch guide, or at least his "optimizing assembly" guide。另请参阅x86 wiki上的好东西。
正如Agner Fog的microarch pdf指出的那样(关于Intel SnB / IvB的第9.8节):
寄存器重命名由寄存器别名表(RAT)和 重排序缓冲区(ROB),如图6.1所示。来自的μops 解码器和堆栈引擎通过队列转到RAT然后转到 ROB读取和保留站。 RAT可以处理4μs 每个时钟周期。 RAT可以在每个时钟周期重命名四个寄存器, 它甚至可以在一个时钟内重命名同一个寄存器四次 周期。强>
read-modify-write是另一个故事(add
指令的目的地)。架构寄存器的读 - 修改 - 写是(一部分)依赖链,而无条件mov
或xor-zeroing启动一个新的dep链。 (与lea
等某些其他指令的输出相同,但不读取其目的地。)
这些寄存器写入仍然将架构寄存器重命名为新的物理寄存器。这就是CPU处理
等案例的方式mov eax, 1 ; start of a dep chain
mov [mem+rax+rcx], eax
inc eax ; eax renamed again
商店需要inc
之前的eax值。它得到它,因为当它检查RAT时,架构eax仍然指向mov eax,1
写的相同的物理寄存器。 inc
不能只修改相同的物理寄存器,因为它不知道如果还没有使用先前的eax
值做什么。