|
4 Y/ G: f1 c9 P6 L- M# x2.2.3 重充电 谈到DRAM的访问时,重充电是常常被忽略的一个主题。在2.1.2中曾经介绍,DRAM必须保持刷新。……行在充电时是无法访问的。[highperfdram]的研究发现,“令人吃惊,DRAM刷新对性能有着巨大的影响”。
f) [$ x! E' j3 g/ ]' ]% t 根据JEDEC规范,DRAM单元必须保持每64ms刷新一次。对于8192行的DRAM,这意味着内存控制器平均每7.8125μs就需要发出一个刷新命令(在实际情况下,由于刷新命令可以纳入队列,因此这个时间间隔可以更大一些)。刷新命令的调度由内存控制器负责。DRAM模块会记录上一次刷新行的地址,然后在下次刷新请求时自动对这个地址进行递增。
( _: S* S# a f9 M' v 对于刷新及发出刷新命令的时间点,程序员无法施加影响。但我们在解读性能参数时有必要知道,它也是DRAM生命周期的一个部分。如果系统需要读取某个重要的字,而刚好它所在的行正在刷新,那么处理器将会被延迟很长一段时间。刷新的具体耗时取决于DRAM模块本身。
1 E A1 }3 R2 c. k2.2.4 内存类型 我们有必要花一些时间来了解一下目前流行的内存,以及那些即将流行的内存。首先从SDR(单倍速)SDRAM开始,因为它们是DDR(双倍速)SDRAM的基础。SDR非常简单,内存单元和数据传输率是相等的。
0 C6 b& @2 G3 j+ \% F# F) x% v" w F+ P7 ]" G' P1 T$ i' R
0 B' o6 c$ W9 @& O6 f7 e
图2.10: SDR SDRAM的操作
4 s# g! \* g: P" H在图2.10中,DRAM单元阵列能以等同于内存总线的速率输出内容。假设DRAM单元阵列工作在100MHz上,那么总线的数据传输率可以达到100Mb/s。所有组件的频率f保持相同。由于提高频率会导致耗电量增加,所以提高吞吐量需要付出很高的的代价。如果是很大规模的内存阵列,代价会非常巨大。{功率 = 动态电容 x 电压2 x 频率}。而且,提高频率还需要在保持系统稳定的情况下提高电压,这更是一个问题。因此,就有了DDR SDRAM(现在叫DDR1),它可以在不提高频率的前提下提高吞吐量。 , y( r/ U) \4 { i: p) `
$ C3 e) R3 `3 f' G6 {3 v ) @. J' `! l- z$ R) A* q
图2.11 DDR1 SDRAM的操作 * {; L2 F7 q4 |5 @
我们从图2.11上可以看出DDR1与SDR的不同之处,也可以从DDR1的名字里猜到那么几分,DDR1的每个周期可以传输两倍的数据,它的上升沿和下降沿都传输数据。有时又被称为“双泵(double-pumped)”总线。为了在不提升频率的前提下实现双倍传输,DDR引入了一个缓冲区。缓冲区的每条数据线都持有两位。它要求内存单元阵列的数据总线包含两条线。实现的方式很简单,用同一个列地址同时访问两个DRAM单元。对单元阵列的修改也很小。 ( J5 l! |" x! F) }+ p
SDR DRAM是以频率来命名的(例如,对应于100MHz的称为PC100)。为了让DDR1听上去更好听,营销人员们不得不想了一种新的命名方案。这种新方案中含有DDR模块可支持的传输速率(DDR拥有64位总线): 0 a5 R5 a9 [5 }5 \- S3 T6 D9 j, f
100MHz x 64位 x 2 = 1600MB/s 于是,100MHz频率的DDR模块就被称为PC1600。由于1600 > 100,营销方面的需求得到了满足,听起来非常棒,但实际上仅仅只是提升了两倍而已。{我接受两倍这个事实,但不喜欢类似的数字膨胀戏法。} ' d( i- a& g3 w9 j' V
7 Q0 f' {$ H Z4 X: r# P
! u6 J: F; G" s: i8 f
图2.12: DDR2 SDRAM的操作 " S: k0 p6 a7 {, O M
为了更进一步,DDR2有了更多的创新。在图2.12中,最明显的变化是,总线的频率加倍了。频率的加倍意味着带宽的加倍。如果对单元阵列的频率加倍,显然是不经济的,因此DDR2要求I/O缓冲区在每个时钟周期读取4位。也就是说,DDR2的变化仅在于使I/O缓冲区运行在更高的速度上。这是可行的,而且耗电也不会显著增加。DDR2的命名与DDR1相仿,只是将因子2替换成4(四泵总线)。图2.13显示了目前常用的一些模块的名称。
, ^, v) H+ G; g; }4 @ 阵列频率 | 总线频率 | 数据率 | 名称(速率) | 名称
' i o- h. c1 U(FSB) | 133MHz | 266MHz | 4,256MB/s | PC2-4200 | DDR2-533 | 166MHz | 333MHz | 5,312MB/s | PC2-5300 | DDR2-667 | 200MHz | 400MHz | 6,400MB/s | PC2-6400 | DDR2-800 | 250MHz | 500MHz | 8,000MB/s | PC2-8000 | DDR2-1000 | 266MHz | 533MHz | 8,512MB/s | PC2-8500 | DDR2-1066 | - U( W9 ]& k" z0 c I3 |
图2.13: DDR2模块名 在命名方面还有一个拧巴的地方。FSB速度是用有效频率来标记的,即把上升、下降沿均传输数据的因素考虑进去,因此数字被撑大了。所以,拥有266MHz总线的133MHz模块有着533MHz的FSB“频率”。
$ K9 o! i/ F; o$ e& X7 \$ Q, W( k DDR3要求更多的改变(这里指真正的DDR3,而不是图形卡中假冒的GDDR3)。电压从1.8V下降到1.5V。由于耗电是与电压的平方成正比,因此可以节约30%的电力。加上管芯(die)的缩小和电气方面的其它进展,DDR3可以在保持相同频率的情况下,降低一半的电力消耗。或者,在保持相同耗电的情况下,达到更高的频率。又或者,在保持相同热量排放的情况下,实现容量的翻番。 7 b; y. R& n4 ^; _; [% C, c, P
DDR3模块的单元阵列将运行在内部总线的四分之一速度上,DDR3的I/O缓冲区从DDR2的4位提升到8位。见图2.14。
/ v+ _9 \/ |6 r/ D* L5 ^* K3 i; m6 p: N% G+ A; _. k, f( g
$ R/ L m9 O" g7 p6 U% Q
图2.14: DDR3 SDRAM的操作 , t/ w. r) D! d6 M! ~
一开始,DDR3可能会有较高的CAS时延,因为DDR2的技术相比之下更为成熟。由于这个原因,DDR3可能只会用于DDR2无法达到的高频率下,而且带宽比时延更重要的场景。此前,已经有讨论指出,1.3V的DDR3可以达到与DDR2相同的CAS时延。无论如何,更高速度带来的价值都会超过时延增加带来的影响。 8 J0 i2 D) E4 G: f8 ~+ w& Z, B
DDR3可能会有一个问题,即在1600Mb/s或更高速率下,每个通道的模块数可能会限制为1。在早期版本中,这一要求是针对所有频率的。我们希望这个要求可以提高一些,否则系统容量将会受到严重的限制。
! ?% F4 p7 ?2 V' e$ u d 图2.15显示了我们预计中各DDR3模块的名称。JEDEC目前同意了前四种。由于Intel的45nm处理器是1600Mb/s的FSB,1866Mb/s可以用于超频市场。随着DDR3的发展,可能会有更多类型加入。
0 k- |( i* q: `, q: x6 ^ 阵列频率 | 总线频率 | 数据速率 | 名称(速率) | 名称- v" O( j" K) |4 M+ x
(FSB) | 100MHz | 400MHz | 6,400MB/s | PC3-6400 | DDR3-800 | 133MHz | 533MHz | 8,512MB/s | PC3-8500 | DDR3-1066 | 166MHz | 667MHz | 10,667MB/s | PC3-10667 | DDR3-1333 | 200MHz | 800MHz | 12,800MB/s | PC3-12800 | DDR3-1600 | 233MHz | 933MHz | 14,933MB/s | PC3-14900 | DDR3-1866* s: o/ ~" f2 V. Y' j
, M0 n+ [, V* q6 `& D1 o/ ~ | 图2.15: DDR3模块名 所有的DDR内存都有一个问题:不断增加的频率使得建立并行数据总线变得十分困难。一个DDR2模块有240根引脚。所有到地址和数据引脚的连线必须被布置得差不多一样长。更大的问题是,如果多于一个DDR模块通过菊花链连接在同一个总线上,每个模块所接收到的信号随着模块的增加会变得越来越扭曲。DDR2规范允许每条总线(又称通道)连接最多两个模块,DDR3在高频率下只允许每个通道连接一个模块。每条总线多达240根引脚使得单个北桥无法以合理的方式驱动两个通道。替代方案是增加外部内存控制器(如图2.2),但这会提高成本。 / S' t, M% d4 ] g& J6 f4 Y7 ^$ x
这意味着商品主板所搭载的DDR2或DDR3模块数将被限制在最多四条,这严重限制了系统的最大内存容量。即使是老旧的32位IA-32处理器也可以使用64GB内存。即使是家庭对内存的需求也在不断增长,所以,某些事必须开始做了。 + I& m. O8 |3 Q# U: k' k4 ^
一种解法是,在处理器中加入内存控制器,我们在第2节中曾经介绍过。AMD的Opteron系列和Intel的CSI技术就是采用这种方法。只要我们能把处理器要求的内存连接到处理器上,这种解法就是有效的。如果不能,按照这种思路就会引入NUMA架构,当然同时也会引入它的缺点。而在有些情况下,我们需要其它解法。
" `$ b! e6 r2 x% h Intel针对大型服务器方面的解法(至少在未来几年),是被称为全缓冲DRAM(FB-DRAM)的技术。FB-DRAM采用与DDR2相同的器件,因此造价低廉。不同之处在于它们与内存控制器的连接方式。FB-DRAM没有用并行总线,而用了串行总线(Rambus DRAM had this back when, too, 而SATA是PATA的继任者,就像PCI Express是PCI/AGP的继承人一样)。串行总线可以达到更高的频率,串行化的负面影响,甚至可以增加带宽。使用串行总线后 - y" J9 c1 \, M' R6 v$ H9 \
- 每个通道可以使用更多的模块。
- 每个北桥/内存控制器可以使用更多的通道。
- 串行总线是全双工的(两条线)。- A: |& O# d4 T5 [/ Y- |
FB-DRAM只有69个脚。通过菊花链方式连接多个FB-DRAM也很简单。FB-DRAM规范允许每个通道连接最多8个模块。
+ h& b- L! b7 G7 ^$ L% O9 a 在对比下双通道北桥的连接性,采用FB-DRAM后,北桥可以驱动6个通道,而且脚数更少——6x69对比2x240。每个通道的布线也更为简单,有助于降低主板的成本。 # \' f% `7 V! O: p5 @* k
全双工的并行总线过于昂贵。而换成串行线后,这不再是一个问题,因此串行总线按全双工来设计的,这也意味着,在某些情况下,仅靠这一特性,总线的理论带宽已经翻了一倍。还不止于此。由于FB-DRAM控制器可同时连接6个通道,因此可以利用它来增加某些小内存系统的带宽。对于一个双通道、4模块的DDR2系统,我们可以用一个普通FB-DRAM控制器,用4通道来实现相同的容量。串行总线的实际带宽取决于在FB-DRAM模块中所使用的DDR2(或DDR3)芯片的类型。
, ?/ e6 A9 }7 g; G/ _! O/ y. P我们可以像这样总结这些优势:
. S8 d, y5 ^* t6 r8 g DDR2 FB-DRAM * d2 u+ v. }2 ~) k
| DDR2 | FB-DRAM | 脚 | 240 | 69 | 通道 | 2 | 6 | 每通道DIMM数 | 2 | 8 | 最大内存 | 16GB | 192GB | 吞吐量 | ~10GB/s | ~40GB/s |
如果在单个通道上使用多个DIMM,会有一些问题。信号在每个DIMM上都会有延迟(尽管很小),也就是说,延迟是递增的。不过,如果在相同频率和相同容量上进行比较,FB-DRAM总是能快过DDR2及DDR3,因为FB-DRAM只需要在每个通道上使用一个DIMM即可。而如果说到大型内存系统,那么DDR更是没有商用组件的解决方案。
' r9 I( L) \* H' y4 C2 d$ j& v |
|