Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (9) - 流水线前端/微指令队列&循环流侦测器LSD

版权声明:转载必须保留原出处,没有书面许可不可用于商用目的, https://blog.csdn.net/qq_43401808/article/details/85997414

Micro-op Queue and the Loop Stream Detector (LSD)

微指令队列将流水线前端与乱序引擎解耦合(即隔离开)。它位于微指令生成单元与重命名单元之间(参看上图),主要功能是用于隐藏不同的微指令来源(即传统译码流水线,MSROM和微指令缓存)产生的“气泡现象(即带宽不均衡)”,确保每周期可以发送4条微指令给流水线后续阶段(即乱序引擎)。

对某些指令类型,微指令队列在译码之后具有一些额外的功能。尤其是,读存操作与计算操作以及所有的写存操作,当使用变址寻址时,在译码器和微指令缓存中都表现为单条微指令(即微熔合机制)。但是在微指令队列中,这些操作会被分裂成两条微指令,被称为“离解”过程(un-lamination process):一条微指令执行读存操作,另一条执行计算操作。下面是一条典型的“读存加计算”指令:

ADD RAX, [RBP+RSI]; rax = rax + LD(RBP+RSI)

类似的,下面这条写存指令具有3个寄存器源(注意不是源操作数),会分解成“生成存储地址”与“生成存储数据”两个字操作。

MOV [ESP+ECX*4+12345678], AL

 

通过“离解过程”生成的额外的微指令会使用重命名和退役带宽;但是,总体上会有省电效果。对于大量使用变址寻址模式的代码(通常是数组处理),重新设计程序算法,使用基址寻址(或相对基址寻址)有时候可以提升程序性能,因为可以保持读存操作与计算操作以及存储操作始终处于熔合状态,即不会被微指令队列“离解”。

The Loop Stream Detector (LSD)

循环流侦测器LSD最初由Intel Core微架构引入(注:位于BPU中)。LSD侦测符合条件的小循环,将其锁定在微指令队列中。循环指令可以直接从微指令队列中获取,不再需要取指/译码或者从任何的缓存中读取微指令,直到分支预测失败结束循环。

符合如下特征的循环方可由LSD/微指令队列锁定:

  • 最多由8个32字节指令块构成
  • 最多28条微指令(~28 x86指令)
  • 所有的微指令同时存在于微指令缓存中
  • 可以包括最多8个采纳分支,且这些分支不能是CALL或者RET指令
  • 不能有未匹配的栈操作。例如,PUSH指令比POP指令多。

许多计算密集型的循环,查找,和软件字符串搬移操作都符合这些特征。

扫描二维码关注公众号,回复: 4890524 查看本文章

软件应该“机会主义式的”使用LSD功能。对于要求高性能的代码,循环展开通常比LSD循环锁定更受推荐,即便是循环展开可能导致无法做LSD锁定(例如代码长度过大)。

猜你喜欢

转载自blog.csdn.net/qq_43401808/article/details/85997414