|
现在的DDR3 DRAM在带宽方面仍然显的不足,有两方面的原因,一个是接口,一个是核心。
接口
DDR3 DRAM采用64位并行线路工作在800~1866Mbps的数据频率上(实际的信号频率还要除以2),采用SSTL15电平(Stub Series Terminated Logic 1.5V),频率受限,一方面是由于其单端、与参考电压比较的特性,另一方面可能是因为内存条的菊花链拓扑结构。
核心
从DDR到DDR3,接口带宽提高了,但是核心频率并没有提高,只是预取的bit数越来越大,从2到8,例如核心频率为100MHz,一次取8bit,然后串行的以800Mbps的速率发送出去,这就是DDR3-800。
DRAM面临的问题
接口带宽的不足可以通过使用其他电平,如LVDS,PCIe3.0使用LVDS单链路可以达到8Gbps的速率,当然考虑的电磁屏蔽,一条链路通常有4根线。(这让我想起了FB-DRAM,貌似也是用差分电平,回头好好调研一下。)
甚至可以考虑用光接口,2010年7月intel宣布成功在硅上集成光电转换装置,数据速率为50Gbps,当然这个代价相对于采用现有的比较成熟的高速差分电平还是相当高的。
但是这又引出了一个问题,有个这么高的接口带宽,核心提供不了这么快的数据这么办?难道又只能通过增加预取bit数来满足吗?
先来看一看预取的利弊。现在的DDR3预取8bits,数据线宽度为64bit,一次传输就是64Byte,刚好一个cache line的长度。如果预取的bit数再多,超过1个cache line,那么在多核情况下,空间局部性很差,这么多的预取很大程度上会造成浪费。
再来看看DRAM核心的设计,先选中一个row,再选中其中的某些column,通常一个row可能会有8192bit,然而每次只取其中的8bit,这也造成了很大了浪费。
怎么充分利用接口的高带宽,同时又提高效率、减少浪费,当然还有很重要的一点,怎么提高并发度,我觉得是DRAM架构的一个挑战。
谈谈我的一些想法:
把一个cache line放在一个bank里,地址也通过高速的链路串行或部分串行的传给DRAM,等所有的地址到了之后再选中该cache line,利用接口的高带宽,通过很少的线路把该cache line串行发送出去。这个想法有点像64Byte预取,只不过只在一个bank里,而不像现在的DRAM Module,横跨8个DRAM chip。
由于只需要很少的引脚就可以实现高带宽,可以将引脚划分为多个通道,提高并发度。取消传统的Rank的概念。
这样可能会增加延时,暂不确定增加的这部分延时对整体性能的影响有多大?能不能通过硬件多线程机制隐藏?
内存分配该怎么做?通常一个线程使用的地址是连续的,这些连续的地址是在同一个bank还是在不同的bank?如果在不同的bank,那一个线程内的访存也可以并发实现;如果在相同的bank,那一个线程内的访存只能串行实现,相当于只实现了线程级的并行。
在内存里面集成高速I/O的成本又多高?
心不静了,暂时先写这么多。。。