内存指令是否通过微体系结构中的load-store队列和issue队列



问题队列和lsq队列的区别是什么内存指令?内存指令是通过两个队列,还是只通过通过LSQ队列。如果他们通过两个队列,他们的顺序是什么?

我假设您在这里使用类似手臂的命名法,因此问题队列是英特尔称之为RS(保留站),并且通过问题您的意思是发送准备执行的顶部。

答案是内存指令需要同时传递这两种指令。所有指令都需要发出(除了那些不需要执行就可以消除的指令,例如寄存器移动、零习惯用法、nops等)。让我们换个说法——所有需要通过ALU的指令都需要首先通过发行过程。内存指令将简单地使用该步骤来计算它们的地址。这对于load来说是正确的,对于store来说通常有一个内部分割成store-address和store-data,所以store-address在这个意义上就像load一样,在这一步计算它的地址。

通常有一个专用的执行端口和专用的执行单元,因为地址计算通常遵循少数特定寻址模式之一(每种体系结构都有不同的寻址模式),但除此之外,执行需要遵循与CPU中任何其他操作相同的规则-它需要准备好其源并从寄存器文件中读取或从飞行操作中绕过。它需要在执行端口空闲时进行仲裁,并按照相同的老化规则进行优先级排序,因此使用公共路径是有意义的。

一旦内存操作完成执行,它将被发送到LSU(负载存储单元,或DCU,英特尔的数据缓存单元),并使用生成的地址执行实际的内存访问。LSU管道将负责地址转换、TLB查找、必要时的页面遍历(尽管有时需要在专用单元中完成)、地址范围和属性检查、缓存查找(如果可缓存)以及在需要时向下一个缓存级别或内存发送缺失。它也可能触发预取作为进程的一部分。

对于负载,当LSU管道完成时(如果L1中没有可用的数据,则可能需要多次传递和唤醒),LSU将再次向问题队列发出信号,以便唤醒依赖结果的任何人。对于store来说,store-address可能会提前将该行提取到缓存中作为优化,但实际的下一步通常是在退役后唤醒(因为store可能不会在推测时被分派到内存中,除非你有一些技巧来处理这个问题)。

值得一提的是,一些cpu尝试优化负载,可以直接从先前的存储转发数据,而不是从缓存/内存中获取数据。这可以包括转发(非常常见)或内存重命名(不太常见)。前者通常由LSU在内部处理,而后者可以在没有LSU的情况下更早地完成(尽管LSU管道通常仍然被激活以验证结果)。