每时钟性能。 - 我可以为同一条指令使用不同的寄存器吗?

时间:2016-03-01 05:28:16

标签: performance assembly cpu-registers clock

我可以使用四个通用寄存器,例如r8,r9,r10,r11,每个寄存器都有MOV指令用于独立操作,并且印象中CPU在一个时钟内执行所有这些指令吗?

我想知道,因为根据Agner Fog的指令表,它说MOV指令的相对吞吐量是0.25。这意味着CPU应该能够在每个周期执行4个MOV操作。或者我误解了所有??

我是一个菜鸟,并且两个月以来一直在MASM学习装配(主要是为了学习调试寄存器如何工作,这真的很有趣)。

1 个答案:

答案 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。另请参阅 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值做什么。