您好,欢迎访问这里是深圳市硕远科技有限公司!
戴尔服务器价格_IBM联想配置_浪潮代理-深圳市硕远科技有限公司
联系我们
戴尔服务器价格_IBM联想配置_浪潮代理-深圳市硕远科技有限公司
邮箱:2324898850@qq.com
电话:400-080-6079
地址:深圳市龙华区河背工业区108创业园A301
当前位置:主页 > 新闻动态 > 行业新闻 >

行业新闻

科普IBM Power8的单线程性能为何如此孱弱?
发布时间:2021-08-13 12:01浏览次数:

当IBM首次披露其新一代服务器处理器“Power8”时,外界曾对它寄予厚望,认为它的规格强大得令人瞠目结舌,堪称蓝色巨人实力的最佳体现。然而从业内公布的Power8 CPU性能测试结果来看,其SPEC单线程的成绩却令许多曾经看好它的人大跌眼镜。一款拥有乱序8发射强劲规格的CPU最后居然被乱序四发射的Intel CPU轻松击败,原因何在?

笔者仔细对比了Power8的微结构公开论文和其他众多工业级微结构的设计,发现其微结构前端设计存在单线程性能上的明显缺陷,下面一起来了解下到底是什么拖累了这位蓝色巨人。

科普IBM Power8的单线程性能为何如此孱弱?

Power8 CPU内部结构版图

虽然从Power8 CPU的微结构规格来看,它就是令人敬畏的怪兽级设计,拥有前端8条指令/周期的取指宽度,并支持8条指令的重命名,10条指令的执行宽度,以及8条指令的交付宽度,似乎是个名副其实的八发射处理器,但实际上并非如表面规格上看到的这么简单。Power8的单线程处理能力在面对分支密集型的整数应用时将受到严峻挑战,主要问题在于取指效率低下。笔者仔细对比了Intel与IBM两边的公开资料后得出的初步结论是,IBM的分支预测准确率有望力敌Intel,但是取指效率恐怕会落后Intel的设计一代到两代。若IBM一方的论文无误,Power8的实际单线程取指带宽远逊于其总体标称值。在分析缺陷的来龙去脉前,先来了解一些基础知识。

科普IBM Power8的单线程性能为何如此孱弱?

科普IBM Power8的单线程性能为何如此孱弱?

采用Power8 CPU的IBM服务器,起步价仅4820美元。

指令读取逻辑基础

一般提及CPU单线程处理能力时,很多时候是代指发掘指令级并行度的能力,也就是超标量执行、推测执行、乱序执行等方面的综合能力,但是要实现这些所有能力有一个前提,就是指令读取的能力。如果指令都读不上来,再强的乱序多发射都是空谈。

取指令的速度对于乱序多发射的微结构来说,不仅关键,而且特殊。在执行后端产生的停顿,诸如一级高速缓存或者二级高速缓存缺失、真实数据依赖等等,都可以靠乱序执行引擎强大的调度能力,在乱序执行窗口内部调度不相关指令提前执行从而予以掩盖或者部分掩盖。概括地说,乱序执行的本质在于用不停顿的指令去掩盖停顿的指令,多发射的本质就是把许多条指令的执行周期进行相互掩盖。但是取指令停顿特殊的地方在于,这种停顿是乱序多发射无法掩盖的。因为连指令都取不上来,再强的乱序多发射也没有意义。正因为此,取指令在专业论文中常常有一个更加高大上的称呼,叫指令供应(instruction supply)。

科普IBM Power8的单线程性能为何如此孱弱?

Alpha21264的流水线框图

以乱序多发射的经典之作Alpha 21264为例,乱序执行引擎的“管辖范围”是从寄存器重命名(rename)阶段才开始。任何发生在这一阶段之前的流水线停顿都是乱序执行所力不能及的,只能依靠流水线来维持吞吐。例如,当一级指令缓存发生缺失,导致取指令停顿时,如果乱序执行所覆盖的流水线中所有的指令尚未排空,就能够暂时维持一段时间的指令结果吞吐,但乱序执行所覆盖的流水线阶段如果都已经排空,整个处理器核实际上就会处于没有指令结果交付、完全在等待二级缓存响应一级指令缓存的状态。

指令供应是乱序多发射,特别是乱序宽发射架构中的核心难点之一。大量的研究发现,取指令效率大致上取决于以下几个方面:

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

精简指令集(RISC)系统的指令长度大都在4个字节,x86虽然是不定长指令集,但统计分析显示编译器产生的指令序列里单条指令的平均长度也在4个字节上下。因此以4个字节计算,如果要做乱序四发射,每个周期就要取4×4=16个字节。如果要让这个乱序四发射的微结构跑在3GHz的主频上,缓存系统仅为满足指令供应需要就得提供至少48GB/s的带宽,这也是现代高性能微结构无一例外地使用指令与数据分离的一级缓存结构的原因之一。

除了带宽压力以外,缓存子系统也必须要恰到好处地留住经常取用的指令、踢出不太常用的指令。一级指令缓存和一级数据缓存一样需要注重局部性、注重替换算法,甚至配备一级指令缓存专属的预读取器(prefetcher)。

2分支预测准确率。

一般的算术逻辑指令不会改变紧跟自己身后的下一条指令的读取地址,但有一大类指令被称为分支指令,包括条件跳转、非条件跳转、函数调用、函数返回,间接跳转等。这一类指令有可能改变下一条指令的读取地址。对于整数应用来说,大约四分之一到五分之一的指令是分支指令,如果处理器做出了分支预测,去预判分支的走向,但是预测发生了错误,就是误预测,或者叫分支预测失败。

分支预测失败的后果是灾难性的,并且可能会进一步触发其他种类的推测执行失败。这些预测失败导致的指令执行最终结果都是被丢弃掉的,不仅拉低了性能还推高了功耗。

3分支预测的判断速度。

这个判断速度分为两部分,其一是分支预测错误恢复时间,有时也称为预测失败惩罚(mis-prediction penalty)。一般来说,分支预测做出以后,需要等到这条分支指令进入乱序执行后端,并且完成执行之后,才能做出预测是否正确的判断,因此分支预测失败的代价大致上等于分支结果计算完成的时间点扣去分支预测做出的时间点,这一时间一般等于简单整数执行周期数的一半或者一大半。在这期间取指的所有指令都是推测性执行状态,如果被发现前头的分支预测失败了,这些推测性执行的指令都要被冲掉,导致前文中提及的现象。

其二是分支预测的预测速度。理想状况下,取指令是每个周期都要进行的,因此每个周期都要进行分支预测。高性能分支预测的方法是查询多张记录了分支历史信息的记录表,判断分支指令的种类、该分支自身的跳转发生情况,围绕该分支的其他分支指令的跳转发生情况等,然后依据这些历史信息为当前的分支点做出预测。为了满足分支预测准确率的要求,一般分支预测历史表都会做得很大。

分支预测历史表本质上也是一块高速缓存,做大了以后也会导致访问延迟升高的问题,而单线程性能对分支预测的预测速度尤为敏感。如果分支指令改变了下一条指令的读取地址,但是分支预测还来不及完成,处理器一般会顺序地接着往下取指,于是就会出现误读取(mis-fetch)。误读取对比误预测来说发现时间短很多,一般可以在短短几个周期内予以发现并且纠正。但是误读取的出现频率远超过分支预测失败,配备了高性能的分支预测器以后,一般每千条指令只会出现几次预测失败,但是若不采取其他设计,误读取的概率是每十条指令即可发生一次。

误读取的效应是非常可怕的。德克萨斯大学奥斯汀分校的研究人员在2000年对180nm和100nm工艺下的分支预测器建模研究结果显示:当分支预测历史表的大小抬升时,由于能够记录更完整的分支历史信息,分支预测准确率会上升,因此带来IPC的提升。但是把记录表加大到需要2个周期才能完成访问时,IPC会下跌20%左右,若是加大到需要3个周期才能完成访问,IPC会下跌到20%~30%。100nm和180nm的访问延迟时间和现在的超深亚纳米工艺自然不同,但是分支预测速度与IPC的关系属于纯微结构特征,并不随着工艺的变化而变化。在22nm、14nm乃至未来的10nm上,分支预测速度的下滑导致的IPC下滑趋势理应是一致的。

科普IBM Power8的单线程性能为何如此孱弱?

分支预测历史表的访问延迟与IPC的关系,每次访问延迟加长一个周期,IPC就会有大约20%左右的跳水式下跌。

4横跨多个基本块的取指。

基本块(Basic block)是广泛使用于编译优化和微结构优化上的一个术语。从指令流中的第一条非分支指令开始,到第一条分支指令结束,为第一个基本块。从上一个基本块之后的第一条非分支指令开始到第一条分支指令结束,为又一个基本块,以此类推。分支指令是基本块的分界线,基本块是许多编译优化和微结构优化技术的操作范围。

SPEC CPU上的一个关键统计数字是,整数指令基本块的平均长度在4~5条指令之间,也就是说每4~5条指令就会遇到一条分支指令。看上去这个数字和前文中提到的“大约四分之一到五分之一的指令是分支指令”对比来看只是换了一个说法,实则有着微妙而重要的不同。

对于基本块末尾的分支指令,如果不发生跳转,对于取指令而言是喜闻乐见的。假设有这样一个指令序列:

算术逻辑指令1、算术逻辑指令2、访存指令3、分支指令4、算术逻辑指令5、访存指令6、访存指令7、访存指令8

分支跳转地址:

算术逻辑指令7、算术逻辑指令8、访存指令9

如果分支指令4不发生跳转,并且取指单元的分支预测器正确预测了这个不跳转的结果,取指单元看到的是就是从算术逻辑指令1开始到访存指令8为止一共8条指令的两个连续基本块,只要取指带宽足够,可以在一个周期里一次性读取8条指令送交译码。如果分支跳转,取指单元看到的指令流就是算术逻辑指令1,算术逻辑指令2,访存指令3,分支指令4共同形成的第一个基本块,以及算术逻辑指令7,算术逻辑指令8,访存指令9共同形成的第二个基本块,这两个基本块前后不连续。处理器的取指单元会在第一个周期读取第一个基本块中的四条指令,如果分支预测器能够进行单周期预测,在第一个周期接近末尾时,取指单元可以得到分支预测器的提醒,从下一个周期开始改变指令读取地址,读取第二个基本块,有效取指带宽就从8指令/1周期跌落到8指令/2周期。

直到今天,笔者所知的多数工业级处理器的取指逻辑仍然恪守着前述做法,每一个周期的取指进行到第一个发生跳转的分支为止,否则进行到取指带宽上限。只有两个连续基本块接口处的分支指令不跳转,那么两个基本块中的指令才可以合并起来满足最大取指带宽。不幸的是,多数基本块结尾处的分支指令是偏向于跳转的,对早期SPECint部分benchmark的统计显示,每两个跳转分支之间的间隔大约为5~8条指令。如果不能够跨越跳转分支进行下一个基本块的取指,有效取指带宽就将被牢牢限制在这个区间上。

受篇幅影响,在下一条微信中将继续讲解Power8的阿喀琉斯之踵,敬请关注。

400-080-6079