IBM POWER8 processor core microarchitecture阅读

这是高级体系结构课程布置的论文阅读,论文题目是《IBM POWER8 processor core microarchitecture》,是用印象笔记写的
链接
可以查看。或者,主体内容如下:

IBM POWER8 processor core microarchitecture

Introduction

Power8 延续了power7系列的多核设计,目标是较大程度的提高socket-level,core-level和thread-level的同时多线程(SMT)能力, 在面积和功耗需求不变的情况下集成了12个核心。
图片1展示了power8与power7的简要对比。
78001e24946172ba720ecde7937e24cf.bmp
由于硅工艺等的增速放缓,性能的提升主要来自于微结构的增强,比如:

  • 更高级的分支预测机制
  • 更广泛的乱序执行
  • 两条指令译码,派遣,发射,执行流水线
  • 高级的八路同时多线程
  • 更高级的带更精确的应用软件控制预取机制
  • cache和memory之间翻倍的带宽吞吐率
  • 与power7相比显著的访存延迟削减
    Power 8的具体改进点有:
  • 从微结构的层面支持了对未对齐的数据和小端数据的快速访问
  • 对几类新的差别特性的支持(defferentiating features),如高级安全、动态编译器优化增强、混合计算、密码学加速、高级SIMD特性、商业分析等等

Organization of the POWER8 processor core

下图展示了它的平面图
48d9259a028cca39d74624e24065d11d.png
IFU(取指)、ISU(指令系列化)、LSU(load-store)、FXU(定点运算)、VSU(向量和标量运算)、DFU(十进制浮点运算)。
在一个给定的周期中,处理核可以取最多8条指令,译码和派遣最多8条,发射和执行最多10条,提交最多8条.
16条流水线包括:2条定点数流水线、2条load/store流水线、2条load流水线、4条双精度浮点流水线(也可以看作8条单精度)、2条对称向量流水线(fully symmtric vector pipeline)、1条加密流水线(cryptographic pipeline)、1条分支执行流水线、1条条件寄存器逻辑流水线、1条十进制浮点流水线。
下图展示了其流水线结构
845555ad6233b6eac4d3f602327bdb8c.png

Instruction Fetch Unit

如下图所示
022d9acd1aa1421f6bd7403130c66f8a.png

Group formation

把来自IBUF的指令组合成group

Instruction decode

在group formation之后,对指令进行译码或者把复杂指令拆分成一系列简单的内部操作

Instruction fushion

把两条相邻的指令安排成一条指令,下图展示了三类情况
aabbbb2bf7f95e28ee290518986ebeb3.png

Branch prediction

分离的预测机制(条件分支是否发生于分支的目标地址)。

  • 关于分支方向。16K-entry的LBHT和16K-entry的GBHT,外加16K-entry的GSEL
  • 关于目标地址。采取两套独立的机制进行计算。一种是256-entry的local count cache和512-entry的global count cache的组合,一种是每个线程的一个link stack。

Pipeline hazards

对SHL(store-hit-load)进行专门检测

Dynamic configuration of IFU mechanisms

通过WORT(workload optimization register for thread control)来进行对一些IFU机制的动态控制

Instruction Sequencing Unit

ISU的作用是派遣指令到不同的发射队列,重命名寄存器以支持乱序执行,从不同的指令发射队列中发射指令至执行流水线,完成执行指令和处理异常条件。下图展示了ISU中指令的逻辑流
9462fac8f8045047cf9faedbbaca65b0.png
在ST模式下,最多可一个group8条,在SMT模式下,可以从两个线程中派遣两个group,一个group4条指令。另外,所有的资源(比如重命名寄存器,不同的队列入口分配)必须准备好了这个group才可以派遣。
GCT(Global Completion Table)用来追踪派遣后的指令的情况。

Load/Store Unit

LSU的作用是执行所有的load和store指令,通过L2 cache和NCU(Non-Cacheable Unit)管理core和系统其余部分的接口,实现Power ISA 的地址转换。power8包含了两个对称的load流水线(L0和L1)和两个对称的load/store流水线(LS0,LS1),下图展示了LS0的微结构
807657c0911aa7a3d110f4f0c52348c6.png

Data fetching

LS0和LS1可以在一个周期执行一条load/store指令,L0和L1可以在一个周期执行一条load指令。
LSU包含的子单元有:

  • load/store address generation (AGEN)
  • execution subunits, the store reorder queue (SRQ)
  • store data queue (SDQ)
  • load reorder queue (LRQ)
  • load miss queue (LMQ)
  • L1 data cache array (D-cache) with its supporting set predict and directory arrays (DDIR)
  • data prefetch engine (PRQ)
    地址转换机制包含:
  • Effective-to-Real Address Translation for data (DERAT)
  • Effective-to-Real Address Translation (ERAT) Miss Queue (EMQ)
  • Segment Lookaside Buffer (SLB)
  • TLB

Load/store execution

在ST模式下,load或store可以用任何合适的流水线执行
在SMT2,SMT4,SMT8模式下,一半线程的指令在LS0和L0中,一半
LS1和L1中

Load/store ordering

采用了store reorder queue(SRQ,40-entry,CAM based,在发射的时候动态分配,在写到L1 D-cache或者发送至L2 cache的时候撤销,支持store forwarding)和
load reorder queue(LRQ,44-entry,real address based ,CAM structure,发生冲突即一个更新的load指令乱序执行在相同地址的load/store指令之前时,刷新该线程的所有的后续的load指令,重新取)来保证按照程序顺序的执行load和store指令。

Address translation

第一层转换包含一个基本的DERAT(48-entry,全相联,CAM based),后续包含DERAT(256-entry,全相联,CAM based cache),一个IERAT,当基本的miss时,再在后续第二级的DERAT中找,找到了就把它调入第一级中;如果两级都没找到,则激活第二层的转换机制,第二层的转换包括一个线程所单独用的Segement Lookaside Buffer(SLB,32-entry-per-thread,全相联,CAM based buffer)和共有的TLB(2048-entry,4路组相联buffer,LRU替换策略,由硬件管理)。
78位虚地址转换成50位实地址。段大小(segment size)可选择为256MB和1TB,4个页大小(page size)可选择为4KB,64KB,16MB和16GB

L1 data cache organization

64KB,8-路组相联,banked,line size是128bytes,包含4个sector(一个32bytes)。store-through design(所有的数据都送到了L2),由EA[51:56]索引,hbrid true/binary LRU替换策略
L1含有4个读端口1个写端口,写比读有更高优先级

Storage alignment

对待大多数的loads和stores未对齐和对齐, LSU有相同的timing表现,少数情况下会有额外代价

Load missing handling

Load miss发送一个reload请求给L2,释放发射队列入口项,在LMQ(load miss queue)中创建一个entry来跟踪cache行,也支持转发技术至目的寄存器。

Data prefetch

在数据流启动后,当前需求的后几行数据会被存储子系统请求,在steady状态实现后,一个附加行给L1,一个附件行给L2,一个附加行给L3。

Fixed-Point Unit

FXU由两个完全一样的流水线构成(FX0,FX1),如下图所示
47d48826dd5d159e58d864456a7aab94.png
每个FXU包含的单元有:

  • multiport General Purpose Register (GPR) file
  • an arithmetic and logic unit (ALU) to execute add, subtract, compares and trap instructions
  • a rotator (ROT) to execute rotate, shift and select instructions
  • a count unit (CNT) to execute count leading zeros instruction
  • a bit select unit (BSU) to execute bit permute instruction
  • a miscellaneous execution unit (MXU) to execute population count, parity and binary-coded decimal assist instructions
  • a multiplier (MUL)
  • a divider (DIV)
  • Software Architected Register file (SAR) and Fixed-Point Exception Register (XER) file为共有
    大多数定点操作在一个周期内完成
    GPR file 含有124-entries,在ST模式下由ISU管理,保持完全相同。

Vector-and-Scalar/Decimal Floating-Point Units

VSU结构如下图所示
f81f4d4a881d495b0c90ddbcca13a304.png

Performance monitoring and adaptive optimization

PMU(performace monitoring unit)用来从指导系统级别的优化和设定,收集程序profiles来反馈优化,支持动态编译和优化技术(比如Java的JIT编译器)

Summary and conclusion

据论文Power8相比于7有1.5倍的单线程表现和2倍的吞吐率表现。

IBM Power8处理器微结构前端分析

以下内容总结来自于IBM Power8处理器微结构前端分析IBM Power8的单线程性能为何如此孱弱?

缓存子系统供应指令的能力

上面已经提到,Power8的每个核心具备32KB的一级指令缓存,每个周期可以读取8条指令,取指带宽为32Bytes。一级指令缓存为8路相联、16-bank的设计,如此大手笔的bank设计可以将8条指令同时读取,并将可能造成的访问冲突降到非常低的程度。此外,Power8的一级指令缓存也配备了指令预读取器,可以预取最多3个缓存块上地址连续的指令。只要一级指令高速缓存的预取和替换策略不出现设计失误,指令缓存一侧的指令供应能力应该是不成问题的。

分支预测准确率

第二个可能出问题的地方在于其分支预测准确率。

首先来看负责条件分支的部分。IBM Power8的锦标赛分支预测器使用了16K全局历史(GBHT)+16K局部历史(LBHT)+16K选择历史(GSEL)的豪华配置,对比Power7的16K+8K+8K的配置可以说是更上一层楼,Intel使用的大小未公布,但可以谨慎乐观地认为在这一个点上Power8至少不会明显落后。
再来看看负责函数调用/返回指令预测的部分。Power8的返回栈预测器并非如Intel一样每个线程独享一个,而是多个SMT线程共享。在单线程状态和两路SMT状态下,每个线程使用32项,在四路SMT状态下就只有16项,八路SMT状态下就只有8项。单线程模式下的32项容量应该说是不错的,Intel的返回栈则是自身16项容量,但并不意味着Intel落后。笔者见到的SPEC CPU上的返回栈预测器容量评估显示16项和32项容量差距很小,而且Intel还使用间接跳转预测器来作为容量满溢之后预测函数调用/返回的后备,使得返回栈预测器几乎可以说是“无限容量”。更为重要的是,在IBM的公开文档中未见提及使用返回栈修复技术,而只是简单地推测性压栈退栈。但返回栈修复这项技术对于返回栈的预测准确率来说至关重要,它旨在帮助返回栈消除由于错误的分支预测触发的后继函数调用/返回。

BTB

最后看看负责无条件分支、并且为所有分支指令提供快速目标地址的分支目标地址缓冲区(BTB),这里IBM的做法就让人有些摸不着头脑了。在指出其潜在缺陷之前,先说一说其设计上的亮点。Power8的一级指令缓存上使用了许多工业级架构上使用的经典技术路预测(way prediction),称为IEAD(Instruction Effective Address Directory,指令有效地址目录)。这项技术的初衷是缩短一级高速缓存的访问延迟,首先推测性地访问一整组存储单元中的单单一个纵列,这样访问速度最快,如果发现访问的位置不对,再多花费一个周期的时间把整组的其他单元一起打开,总能寻找到要的那一个。这一项技术已经比较成熟,是一项值得赞扬的取指令优化设计。但更重要的是,分支目标地址缓冲区(BTB)在哪儿呢?

第一个可以基本确认的缺陷出现在分支预测判断速度上。在IBM的论文和框图中反复搜寻,均未找到分支目标地址缓冲区或者类似结构的存在。分支目标地址缓冲区的缺失可以说是灾难性的,每次碰到分支指令时都要等待分支预测器的预测结果才能进行取指,这意味着每次取指时一旦碰到跳转分支指令就要多消耗几个周期等待分支预测的结果和分支目标地址的重新计算。而早在上世纪80年代早期,相关的解决方案就已经出炉了,连早期的Cortex-A8都有采用,这个缓冲区会保存经过分支预测器确认的,一部分最常执行的分支指令目标地址,每次取指时不用等待分支预测器的新结果就可以按照过往预测结果继续取指,一本万利的买卖,各家谈论自己的微结构时都不会回避这一结构,为何IBM不见提及?如果没有分支目标地址缓冲区,那么分支预测的速度就会极大地影响前端的性能表现。分支目标地址缓冲区的问题尚且可以说存疑,有可能Power8是真用了,但就是在跟大家玩捉迷藏。
而给予Power8的单线程性能确确实实最沉重一击的地方,就是其分支预测的预测速度和相关补全机制的缺失。下面的翻译内容来自在IBM内部期刊上的Power8论文:“如果遇到跳转分支,需要花费3个周期才能得到下一次取指的地址,其中两个周期,对于这个线程来说不会有取指动作进行。然而,在SMT模式下,这两个周期一般会被分配给其他活跃线程,所以(吞吐量,笔者补充)没有损失。如果取上来的指令没有包含任何无条件分支或者是预测跳转的分支,那么下一次读取的地址就是顺序递增的地址,不会浪费取指周期。”第一句话实际上是说Power8的分支预测需要3个周期才能输出结果,这与其他许多工业级微结构的设计类似,但是一般会加入大容量的分支目标地址缓冲区,或者使用大步进顺序预取指之类的方法补救,而Power8在此处简直是裸奔出场,在取到的8条指令中如果遇到哪怕一个跳转分支,那么在接下来2个周期的时间里就只等待分支预测结果,不再取指。这一下就让Power8的前端单线程指令效率在遇到跳转分支时跌为8指令/3周期,几乎成了单线程2.66发射的处理器!5479ff905f28aaf40d29256f8dd7c30f.webp

翻阅Power7的文档,笔者发现Power7也存在同样的问题,论文中声明分支预测需要3个周期才能完成,但由于加入了128项分支目标地址缓存(BTAC),可以缓解遇到跳转分支时带来的取指停顿,其前端框架图中也明确绘制了这一结构。先不说这个分支目标地址缓存容量是否寒酸的问题,起码该有的是有的,而Power8的微结构当中这一关键结构却莫名其妙地不见踪影,倒是Power8的分支预测器尺寸比Power7明显加大。6eb34d92a40eaa53dfbc9b78b919257d.webp
▲Power7的结构框图,红色框处就是分支目标地址缓存。
那么竞争对手Intel是怎么处理这个问题的呢。从早期的奔腾4开始,Intel吸收并实现了一项被称为踪迹缓存(trace cache)的技术,实现了每个周期跨越多个基本块进行取指,跳转分支以及跟随其后的指令会在踪迹缓存的处理下自动塌缩并连接成一条无间断的指令流,舒舒服服地提供给乱序执行引擎。这一技术后来更演化为闻名天下的uop cache,不仅保存无间断指令流,而且保存的指令都是x86不定长指令翻译而来的定长精简指令。由此笔者认为,Power8的取指前端设计在这一点上大大落后于Intel,IBM确确实实在单线程设计上略逊一筹。

posted @ 2021-01-05 15:38  奶牛不夺21冠不改名  阅读(527)  评论(0)    收藏  举报