关于QPI的一些数据

Intel从2008年,core i7,开始引入QPI,QuickPath Interconnect。core i7采用的是Nehalem架构(第一款?),QPI的主要作用是取代原有的前端总线,

QPI的时钟频率主要有两种标准:2.4GHz或3.2GHz。每个时钟频率内可以传输两次,所以Intel手册中所说的bit rates是指每秒能传输多少次,单位GT(G Transfters per second),如前面两种分别对应着4.8GT和6.4GT。

  前端总线 QPI
拓扑 BUS Link
信号技术 GTL+ differential signaling
Rx Data Sampling source synchronous data sampling forwarded clock
总线宽度(位) 64 20
最大数据传输宽度 64 16
双向总线 No Yes

物理层的传输单位是Phit,一个Phit是20位或者10位或者5位。

链路层的传输单位是Flit(flow control unit),每个Flit是80位。每80位里面应当包含8位的CRC,这就是为什么一个Phit即便装满了20位,但实际上也只有2个字节。

传统的前端总线的带宽很好计算。比如我的电脑是Intel Core2 P8600,前端总线的时钟频率是266MHz,倍频是9,所以CPU主频是2.4G,前端总线速度是266*4=1066MHz,而总线宽度是64位,那么总线带宽就是1066Mhz*8Byte=8.5GB/s。

Intel号称它的QPI带宽可达到25.6GB/s。但是这个数据是怎么计算出来的呢?维基百科上给出的答案是:

3.2 GHz
乘以 2 bits/Hz (double data rate)
乘以 20 (QPI link width)
乘以 (64/80) (data bits/flit bits)
乘以 2 (unidirectional send and receive operating simultaneously)
除以 8 (bits/byte)
= 25.6 GB/s
但是我觉得这个并不对。实际上计算方式是:假设时钟频率是3.2GHz,那么bit rates就是6.4GT,由于物理层每秒能传输20位,但是实际上是2个字节,所以12.8GB/s,但是又因为是双向传输,所以double一下,就是25.6GB/s。

假设CPU的每个cache line是64字节,那么需要32个Phits(而不是64/5=12.8个),但是header和CRC还需要8个字节,那么实际上传输一个cache line需要36个phits,那么所需要的时间等于1/6.4 * 36 =5.6ns。根据测试数据,现代平台上,DDR3内存的访问延迟一般在40-70ns。

从这点可以看出,摩尔定律失效的魔咒不仅降在了CPU主频上,而且也落向了总线上。对于高性能计算而言,最关心的就是内存的带宽和延迟。目前来说,虽然系统所能支持的最大内存数量一直在飙升,比如Dell的R910已经能支持1TB的内存。但是,但是!亲爱的,QPI的单向传输速度理论最大值只有12.8GB,想要提升总线频率非常难,于是这个带宽短期内也不会有什么变化。目前还没有看到Sandy Bridge的数据,但是据我估计,QPI依然会停留在6.4GT的水平。可是我在想,如果有一个机器有很大的内存,那么java在做GC的时候,如果在不同的CPU之间来回搬内存,结果会怎样……

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥