POPPUR爱换

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

搜索
查看: 14341|回复: 39
打印 上一主题 下一主题

[已更新]多线程性能的向前一大步:Haswell CPU微架构变化

[复制链接]
跳转到指定楼层
1#
发表于 2012-9-13 13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 itany 于 2012-9-15 15:14 编辑



虽然Intel比较低调,但是Haswell并不是像之前一般认为的那样,在CPU微架构上变化不大。恰恰相反,变化还是很大的。



首先应该注意到的是,Haswell在保留站(RS)上增加了两个发射口。Intel开始推出Core架构(Conroe)之后,一直都是6个发射口,其中有三个发射口(0、1、5)上边挂整数单元ALU,2个口上边挂地址计算单元AGU(2、3),还有一个口是写数据。Nehalem引入超线程,Sandy Bridge引入环形总线,这6个口的基本格局都没有变化。折旧决定了峰值的执行能力就是每周期三个整数微操作,两个读写微操作。其中只有一个ALU能执行分支操作。而对于Haswell,在6号口增加了一个ALU,意味着单个周期能能执行4个整数微操作,更重要的是,这个ALU还能进行分支操作。意味着每个周期能进行两次分支运算。在7号口增加了一个AGU,计算写操作地址,意味着Haswell每周期能执行两个读微操作,一个写微操作。

对于单线程而言,每周期进行一次分支计算是合理的,因为分支单元和前端的分支预测之间是耦合的,而且涉及到推测执行的回溯问题;但是对于超线程,每个线程每周期执行一次分支才是最佳的方案。同时,一般x86程序在执行的时候,指令并行度一般在1.2-2左右,表明,在没有超线程的情况下,不管是Sandy Brige还是Haswell,ALU资源是相对过剩的;而一旦在超线程并行执行的过程中,ALU又可能存在不足,制约性能的发挥。现在Haswell解决了这个问题。另外,在x86程序中往往涉及内存访问的指令占到20%,多的可以占到40%。从Conroe开始,就采用了内存消岐技术,使得读微操作能越过写微操作,大大降低了延迟。新增的AGU增加了内存访问的吞吐能力,对降低延迟有好处。



与此相配合,Haswell增加了取指令的带宽,也就是L1I缓存的读取带宽。之前Sandy Bridge的带宽是16字节每周期,现在没有Haswell的数据,我认为可能增加到24. 实际上从Sandy Brige开始,在解码器之后就有一个微操作缓存,这是从Netburst微架构继承下来的,在执行小规模循环的时候,就不用前端解码器反复进行解码操作,直接从微操作缓存里边读取就可以了。实际上这也在一定程度上掩盖了取指令带宽不足的问题。在x86指令的情况下,平均指令长度大约为2.5-3.5字节,而x64指令长度增加了1个字节以上,达到3.5-4.5个字节,最长可以到15个字节。Haswell的前端实际上每周期能预读6条指令,但从平均指令长度可以看出,在带宽瓶颈下,一般只能做到3-4个指令。要在微操作缓存没有作用的情况下把后边喂饱,充分发挥宏融合和微融合,增加取指带宽是必要的。

更好的分支这个太笼统,说不清。但是从历史上看,Conroe、Nehalem、Sandy Bridge的分支都是有重大改进的,甚至是重新设计,Haswell应该也不差。

在指令解码之后,微操作经过一个队列,进入重排缓存(ROB),之后进行寄存器重命名,进入调度器。调度器扫描微操作,并将能并行执行的指令送到发射口上去执行。调度器能看到并检测是否能并行处理的微操作个数叫做乱序执行窗口(OoO Window)。对于Sandy Bridge,这个是168个,Haswell增加到192个。同时,ROB数量应该也相应增加,从54个增加到60个。从Sandy Bridge开始,Intel使用硬件寄存器文件来实行寄存器重命名。Haswell的整数和浮点寄存器相对Sandy Bridge都有所增加。

在处理器执行读写微操作的时候,首先通过AGU来生成地址,之后会把相应的读写操作放在读操作队列和写操作队列里边。处理器会检查队列里边的读写指令是不是有冲突,在没有冲突的前提下,按照乱序执行读写操作,尽可能提高内存性能。不管是二级缓存、三级缓存都是有较大延迟的,内存延迟更大,显然同时执行的读写操作(in-flight load/Store)越多,越能够掩盖延迟。Haswell相对Sandy Bridge在这方面也有提高。当然,这也是为了和更多的AGU相配合的。



x64架构在进行内存访问的时候需要进行地址转换,转换的时候使用四级页表结构。内存通过分页进行划分,传统的分页大小是4KB,但是这样对于较大的数据结构太零散,往往也采用2M的分页大小(还有1G的超大分页,不过用的少)。每次访问都需要查表。因此,把页表放在旁路转换缓存(TLB)里边。从Nehalem开始,Intel搞了两级TLB结构,和L1、L2缓存类似。但是,一直以来L2 TLB就只是支持4KB分页。在Haswell里边形成了4K分页与2M分页共用1024,比之前扩大了一倍,而且在2M分页的情况下,有助于提高性能。这对于特定的应用,如数据库,无疑会提升性能。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
2#
发表于 2012-9-13 13:56 来自手机 | 只看该作者
技术文,马克待学习
回复 支持 反对

使用道具 举报

3#
发表于 2012-9-13 14:03 | 只看该作者
本帖最后由 acqwer 于 2012-9-13 14:03 编辑


Haswell的Cache带宽是SNB的2倍
回复 支持 反对

使用道具 举报

4#
发表于 2012-9-13 14:03 | 只看该作者
那就是说,以前的多线程都很废咯?

要等到下一代才有真正改进?
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2012-9-13 14:49 | 只看该作者
本帖最后由 itany 于 2012-9-15 12:02 编辑



在矢量方面,看Haswell的执行资源,可以知道,在0、5发射口上可以执行(浮点)矢量指令。这个从Conroe开始就是如此了。相对于通过增加ALU提高整数性能,在浮点方面,Intel选择增加SIMD指令的操作数数量来提高浮点预算的吞吐量。在Sandy Bridge,Intel引进了AVX指令,操作数256位,可以包含4个双精度浮点数(DP flops),加上每周期两条指令,形成每周期8DP的运算能力。在Haswell,通过引进加乘(FMA)操作,使得每个指令能运行一次加法和一次乘法,运算能力再次加倍到16DP。

这个是理论性能。从实际来看,从SSE到AVX,增加的是操作数数量,既然能通过循环展开等优化到2个操作数的SIMD,当然也很容易优化到4个操作数乃至Xeon PHY的8个操作数指令。然而加乘操作需要对加法和乘法进行配平和合并。在算法加法比乘法多得多,或者乘法比加法多得多的情况下,是难以大量使用加乘的;同样的,在加法和乘法无法集中交叉进行的算法里边,也是难以实现的。因而,实际的性能提升,会比引入AVX小。



随着矢量单元宽度的扩展,对于数据吞吐量也提出了新的要求。Nehalem有的L1缓存有一个16字节的读取口和一个16字节的会写口;在Sandy Bridge增加为两个16字节的读取口和一个16字节的回写口。和两个AGU相匹配,在执行AVX的内存读写的时候,可以将两个读取口拼成一个32字节的口,这样每周期能完成该一个读取,两个周期完成一个回写。显然这个带宽,对于需要密集内存访问的情况是一个瓶颈。在Haswell里边,将带宽加倍,做成两个32字节的读取口和一个32字节的回写口,这样一个周期可以完成两个AVX读取和一个回写操作。值得注意的是,由于Sandy Bridge是加了一个口,所以对于算术指令也增加了每周期一个读取;而对于Haswell来说,加宽带宽对算术指令没有影响。

同时增大的还有L2缓存的贷带宽,从32字节增加到64字节。

Haswell还消除了L1缓存的缓存组(bank,翻译成“组”不知道是不是靠谱)冲突。缓存是划分成组的,每组有专门的读写电路。在单个线程访问的时候不存在问题,但是当两个线程或者更多同时访问一个组的时候,由于无法同时提供服务,就会出现阻塞。按照我个人的理解:在GPU里边出现类似的问题要通过编程作者和编译器来解决,但是在CPU里边,缓存是硬件控制的,完全可能会把不同线程访问的内存地址映射到一个组里边,还是需要硬件来解决。Haswell的缓存算法应该进行了相应的改进。对超线程会有一定的帮助。

缓存的访问和更替的基本单位都是行。随着AVX指令的操作数拉长,跨越缓存行的情况可能会增加。显然,在未优化的情况下,会需要两倍的操作,会影响性能。Haswell对此进行了优化。



为了支撑CPU核心的吞吐量增长,不属于CPU核心,而属于整个CPU的L3缓存性能也有一定的提高。在Haswell中,数据访问和其他访问进行了分离,采用不同的流水线进行处理。对于不同核心共享的系统资源,如系统代理(System Agent,就是原来的北桥),改善了信用管理机制,使得系统代理的负载能够在不同的核心之间更好的分配。提高了系统内存写入的吞吐量,增加了内存写入队列的深度,可以更好的进行调度。



总体而言,从吞吐量而言,Haswell的核心相对于Sandy Bridge增加了一倍,而CPU整体的存储带宽也有所增加。而从延迟来看,AVX乘法的延迟是5个周期,加法是3个周期,而FMA的延迟是5个周期。意味着使用FMA能将延迟降低40%,对提高性能也有好处。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

6#
发表于 2012-9-13 17:40 | 只看该作者
我觉得还是不要用那么多专业术语
回复 支持 反对

使用道具 举报

7#
 楼主| 发表于 2012-9-13 18:02 | 只看该作者
本帖最后由 itany 于 2012-9-16 23:51 编辑

众所周知,应用程序的执行调度基本单位是线程,一个线程某个时刻只能在一个CPU核心上执行。不管系统有几个核心,如果程序的工作线程只有一个,那么就只能利用到一个核心。要利用到多个核心,常用的做法就是创建多个线程,分别在不同的核心上运行,这些线程属于一个进程,有共同的内存空间,数据是共享的。

然而这样又有一个问题,共享内存的情况下会导致不同线程在对相同内存地址进行读-写和写-写操作的时候发生竞争问题。Intel举了一个比较生动的例子:



在表中存了一个A 100刀的数据。Alice要从里边拿50,Bob要拿走60,如果要同时操作的话(实际上A稍微早一点的话),那么最后表里边的数据就变成40. 显然,如果Alice和Bob都拿了的话,那么A应该变成-10. 这时候就应该引入锁操作,避免问题的发生。Alice想要从A拿50,这样Alice锁定了这个表,从A里边拿了50之后A就剩下50,然后释放这个表。Bob想要在A里边拿60,但是表锁定了,没法访问,就等着,一直到锁定释放。表释放时候,Bob再锁定这个表,这时A剩下50,已经不够了,余额不足就失败了。显然,这样是合理的。



锁定操作有不同的粒度。比如,粗粒度锁定整个表,而细粒度锁定单个的表项。在表中有A 100刀,B 200刀。当Alice要从A拿20刀的话,如果锁定了整个表,那么Bob再想从B拿30刀,就不得不等到A操作完毕释放锁定。如果只是锁定表项的话,那么,Alice要拿钱的时候只是锁定了A项,Bob在拿钱的时候就锁定B项就好了,完全可以同时操作。



然而,细粒度的锁定将会有很大的问题。比如说,Alice需要从A转20到B,其操作是锁定A项和B项。但是如果Alice和Bob都要转款,Alice要从A转到B,而Bob要从B转到A,就可能发生Alice锁定了A,要去锁定B;同时,Bob锁定了B,要去锁定A。这时候就形成了死锁,彼此都在等待,程序就出问题了。为了避免类似的问题出现,需要对数百万行程序进行查错调试,需要大量的工作,也可能会遗留错误。




Intel希望通过硬件上的功能加强,来实现,对于开发者只要粗粒度的锁定,而在实际执行中,相当于细粒度,Alice和Bob不需要相互等待,按照串行执行,而是可以并行执行,通过硬件来检测实际上是否出现了冲突。换言之,通过将线程并行化,提高执行效率。





Intel通过事务同步(TSX)方式来简化锁定操作。可以在程序里边定义一段代码,这个代码属于一个“事务”,CPU会追踪这个事务中读过和写过的所有寄存器和内存地址,并将所有回写的数据放在临时缓存中,而不是实际的寄存器和内存中。这样,在执行事务的时候,系统的状态并没有发生变化。若事务的执行过程所读的寄存器和内存地址没有其他线程写入,并且所写的寄存器和内存地址没有其他线程读写,则事务执行成功,CPU将事务执行的结果统一更新到寄存器和内存;若相反,则放弃这段事务,丢掉已经执行的结果,系统状态不发生改变。换言之,之前的内存锁是禁止访问,避免冲突;现在的事务同步是先访问着,出了冲突再作废。

显然,这种处理方式是投机执行中的一种。分值预测是一种投机执行,内存消岐也是投机执行(从Conroe开始可以将读操作提前到写操作之前),事务同步也是一种投机执行。自然,投机在失败时候会损失性能,但是,通过程序的优化,投机成功率会非常大,带来的性能提升也是可观的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

potomac 该用户已被删除
8#
发表于 2012-9-13 18:18 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2012-9-13 18:26 | 只看该作者
本帖最后由 itany 于 2012-9-15 15:12 编辑

从上述分析可以看出,Haswell增加了前端取指解码的能力,提高了后端微操作发射执行的能力。然而受制于应用程序的指令并行度的影响,对于单线程的作用较小,而对于超线程,影响较大。可能在单线程应用中提升一般在10%以内,但是超线程的加速比有可能提升20%,甚至更高。

支持AVX的应用程序将会有较大的性能提升。特别是适合加乘合并的程序,通过使用AVX2指令集,有望得到50%甚至接近100%的性能提升。

多线程应用,特别是渲染等多媒体应用,得益于超线程的加速比提升,和AVX,性能提升有望最高达到100%;而很多服务器应用及HPC应用,受益于超线程、AVX、交易内存,性能提升也会非常明显。当然,前提是程序需要进行相应优化。

所以,我认为,Haswell的CPU微架构改进更倾向于服务器应用,也就是Xeon主导的改进。现在Sandy Bridge Xeon最高8核心,Ivy Bridge可能会有10核心,而Haswell恐怕会最高12核心。当年Nehalem Xeon双路战四路Opteron还能赢的场景,还历历在目,恐怕这次按摩店的Opteron又要吃瘪了。



对于桌面用户来说,可能一般的应用下,CPU性能差别并不明显,haswell更主要的是在功耗控制下发挥最大的计算性能。通过改进制造工艺和电路设计,能够实现更好的电压-频率特性(相同频率更低电压;相同电压更高频率),并继续空闲的功能单元通过电源开关(Power Gate)进行关闭。此外,Haswell将系统的频率和供电区域进行了细分。原来环形总线和L3缓存是和核心耦合的,现在将核心与L3缓存、环形总线进行分离。另外通过控制单元,将能耗额度进行动态分配,根据负载的特性向关键单元进行倾斜,实现最大的性能。



而对于笔记本等用户,主要是要实现更好的节能,能够有利于更好的热设计,延长电池使用时间。CPU增加了一个新状态C7,是迄今为止最深入的休眠状态,CPU的时钟完全停止,主要单元停止供电。而在不同的能源状态下切换的速度提高了25%,改善了体验。同样的,Haswell增加了一个新的电源状态S0ix,系统认为处理器是活动状态的时候进入休眠,从而降低系统功耗。而控制单元能根据软件需求、定时器时间、延迟要求、历史、设备触发等条件综合进行控制。

此外,Haswell集成了电压调节器能对自身的各个电压区域进行更精确的控制。同时,Haswell更重视整个系统的功耗控制。包括屏幕的自动刷新,使得在屏幕点亮的情况下CPU也能进入低功耗状态。在南桥提供了I2C、SDIO、I2S、UART等低功耗的接口。对于连接CPU和南桥的DMI总线,以及PCI-e、SATA、USB等高速外部接口也增加了新的电源状态。



Intel宣称,Haswell相对于2011年的Sandy Bridge,能够将待机功耗降低到1/20. 而将双核Haswell装上平板,使用被动散热,并维持一个很长的电池使用时间,也不在困难。值得相信,Haswell不仅能推动超基本向前一大步,而且,也将开创高性能平板电脑的新时代。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

10#
发表于 2012-9-13 19:21 | 只看该作者
难怪这么彪悍,想想汇编里面到处都是mov jump之类的,一旦内存非相干了效率会提升多少哇

即使是今天,想想core的6发射,仍然感觉异常暴力;不过256bit的AVX是否有足够的必要?个人感觉这种数据实在是太长了,有没有资源浪费的可能?如果有实际的代码例子就最好了
回复 支持 反对

使用道具 举报

11#
发表于 2012-9-13 19:41 | 只看该作者
下代顶级是IVB-E,那么haswell的提升会很有限
回复 支持 反对

使用道具 举报

12#
 楼主| 发表于 2012-9-13 20:33 | 只看该作者
daniel_k 发表于 2012-9-13 19:21
难怪这么彪悍,想想汇编里面到处都是mov jump之类的,一旦内存非相干了效率会提升多少哇[mellow>

即使是 ...

有这个必要

其实您想想,一个AVX指令就相当for循环跑四次罢了。这就是循环展开的奥秘。
我觉得早晚SIMD指令会继续发展到512位,也就是8个DP操作数。和Xeon Phy平台统一。
如果快的话,Broadwell就能有些痕迹。下一代,也就四2017年就可以实现了。
回复 支持 反对

使用道具 举报

13#
 楼主| 发表于 2012-9-13 20:54 | 只看该作者
fish2fish 发表于 2012-9-13 19:41
下代顶级是IVB-E,那么haswell的提升会很有限

只是Xeon慢一些罢了。并不说明任何问题。
回复 支持 反对

使用道具 举报

14#
发表于 2012-9-13 21:10 | 只看该作者
价格决定一切,其他都是白扯
回复 支持 反对

使用道具 举报

15#
发表于 2012-9-13 21:34 | 只看该作者
文盲路过
回复 支持 反对

使用道具 举报

16#
发表于 2012-9-13 22:50 来自手机 | 只看该作者
技术贴啊。看完了。希望以后对多线程能有更多优化
回复 支持 反对

使用道具 举报

17#
发表于 2012-9-13 23:56 | 只看该作者
gpu的画质如果还是很烂的话不管啥性能依然不爱用啊
回复 支持 反对

使用道具 举报

18#
发表于 2012-9-14 02:25 | 只看该作者
楼主辛苦,介绍得非常好。原来对core和haswell CPU架构根本不了解,现在知道一些。这个架构很有趣,感觉和ti c6000系列dsp很相似。那些个RS上挂的port(0~7),类似于dsp里的执行单元(比如L、S、D等),也是可以同时执行不同的指令,当然前提是这些指令没有相关性。

嗯,和dsp相似的地方实在太多。Haswell非常值得期待,Intel在CPU架构提升上还大有可为。
回复 支持 反对

使用道具 举报

19#
发表于 2012-9-14 13:23 | 只看该作者
期待T神来这里科普ARM怎么个先进法
回复 支持 反对

使用道具 举报

20#
发表于 2012-9-14 15:14 | 只看该作者
ARM还是赶紧去亲吻AMD吧——维系联盟的是恐惧,而不是友爱
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

广告投放或合作|网站地图|处罚通告|

GMT+8, 2024-4-26 13:40

Powered by Discuz! X3.4

© 2001-2017 POPPUR.

快速回复 返回顶部 返回列表