gpt4 book ai didi

assembly - 通过寄存器重命名器对寄存器进行微架构清零 : performance versus a mov?

转载 作者:行者123 更新时间:2023-12-01 21:13:19 36 4
gpt4 key购买 nike

我读到on a blog post最近的 X86 微体系结构还能够在寄存器重命名器中处理常见的寄存器清零习惯用法(例如将寄存器与自身进行异或);用作者的话来说:

"the register renamer also knows how to execute these instructions – it can zero the registers itself."

有人知道这在实践中是如何运作的吗?我知道一些 ISA,比如 MIPS,包含一个在硬件中始终设置为零的架构寄存器;这是否意味着 X86 微体系结构内部具有类似的“零”寄存器,方便时寄存器会映射到这些寄存器?或者我的心理模型对于这些东西在微架构上如何工作不太正确?

我问的原因是因为(从一些观察来看)似乎在循环中从一个包含零的寄存器到目的地的 mov 仍然比通过将寄存器清零要快得多在循环内进行异或。

基本上,我想根据条件将循环内的寄存器清零;这可以通过提前分配一个架构寄存器来存储零(在本例中为%xmm3)(在整个循环期间不会被修改)并在其中执行以下命令来完成:

movapd  %xmm3, %xmm0

或者使用异或技巧:

xorpd   %xmm0, %xmm0

(均为 AT&T 语法)。

换句话说,选择是在循环之外提升常量零或在每次迭代时在循环内重新实现它。后者将事件架构寄存器的数量减少了一个,并且通过处理器对特殊情况的感知和异或惯用语的处理,看起来它应该与前者一样快(特别是因为这些机器无论如何都有比架构寄存器更多的物理寄存器,所以它应该能够在内部完成与我在汇编中所做的等效的事情,通过提升常量零甚至更好,在内部,具有完全的意识和控制自己的资源)。但似乎并非如此,所以我很好奇是否有任何具有 CPU 架构知识的人可以解释这是否有一个很好的理论理由。

本例中的寄存器恰好是SSE寄存器,并且机器恰好是Ivy Bridge;我不确定这些因素有多重要。

最佳答案

执行摘要:与较慢的mov立即数、reg指令相比,每个周期最多可以运行四个xor ax, ax指令.

详细信息和引用:

维基百科对寄存器重命名有一个很好的概述:http://en.wikipedia.org/wiki/Register_renaming

托比昂·格兰伦德 (Torbjöorn Granlund) 的计时指令延迟和吞吐量AMD 和 Intel x86 处理器位于:http://gmplib.org/~tege/x86-timing.pdf

Agner Fog 在他的 Micro-architecture study 中很好地介绍了具体细节。 :

8.8 Register allocation and renaming

Register renaming is controlled by the register alias table (RAT) and the reorder buffer (ROB) ... The µops from the decoders and the stack engine go to the RAT via a queue and then to the ROB-read and the reservation station. The RAT can handle 4 µops per clock cycle. The RAT can rename four registers per clock cycle, and it can even rename the same register four times in one clock cycle.

Special cases of independence

A common way of setting a register to zero is by XOR'ing it with itself or subtracting it from itself, e.g. XOR EAX,EAX. The Sandy Bridge processor recognizes that certain instructions are independent of the prior value of the register if the two operand registers are the same. This register is set to zero at the rename stage without using any execution unit. This applies to all of the following instructions: XOR, SUB, PXOR, XORPS, XORPD, VXORPS, VXORPD and all variants of PSUBxxx and PCMPGTxx, but not PANDN etc.

Instructions that need no execution unit

The abovementioned special cases where registers are set to zero by instructions such as XOR EAX,EAX are handled at the register rename/allocate stage without using any execution unit. This makes the use of these zeroing instructions extremely efficient, with a throughput of four zeroing instructons per clock cycle.

关于assembly - 通过寄存器重命名器对寄存器进行微架构清零 : performance versus a mov?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17981447/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com