每个时钟的性能。 - 我可以使用不同的寄存器进行相同的指令吗

问题描述:

我可以使用说四个通用寄存器说​​r8,r9,r10,r11每个与MOV指令独立操作,并在CPU在单个时钟中做所有这些指令的印象?每个时钟的性能。 - 我可以使用不同的寄存器进行相同的指令吗

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

我是一个noob,自从两个月以来一直在MASM学习Assembly(主要是为了学习调试注册表的工作方式,它非常有趣)。

编辑,只是重新读你的问题,你问不同的寄存器。我会留下我原来的答案;让我们假装你的问题不只是最微不足道的情况。 :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(原始奔腾)的超标量按顺序设计仍然可以利用这四个独立指令中的并行性,但在其他许多情况下则不行。

在手工制作的循环中,SnB系列CPU每个周期能够维持3个以上的融合域uops是很常见的。 (它也很容易写,在每个周期小于一个融合域UOP运行,由于延迟循环,更不用说高速缓存未命中或分支误预测的。)


是,多次写入相同架构寄存器可以并行执行。注册重命名不是英特尔或AMD设计的瓶颈。

要了解和充分利用Agner Fog的桌子,您必须阅读his microarch guide, or at least his "optimizing assembly" guide。请参阅 wiki上的好东西。

作为昂纳雾的microarch PDF指出(见第9.8约英特尔SNB/IVB):

寄存器重命名由寄存器别名表(RAT)和 的重新排序缓冲器(ROB)控制的,示于图6.1。来自 解码器和堆栈引擎的μops通过队列前往RAT,然后到达ROB-read和保留站。 RAT可以在每个时钟周期处理4个微秒 。RAT可以在每个时钟周期重命名四个寄存器,即 ,甚至可以在一个时钟周期 周期内重命名同一个寄存器四次。

读 - 修改 - 写则是另一回事(一个add指令的目的地)。体系结构寄存器的读 - 修改 - 写是一个依赖链(的一部分),而无条件的mov或异或归零启动一个新的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