为什么没有与高速缓存行大小一样宽的数据总线?

Why isn't there a data bus which is as wide as the cache line size?

当发生高速缓存未命中时,CPU 从主内存中提取整个高速缓存行到高速缓存层次结构中。 (在 x86_64 上通常为 64 字节)

这是通过数据总线完成的,在现代 64 位系统上只有 8 字节宽。 (因为字长是8字节)

编辑: "Data bus" 表示在此上下文中 CPU 芯片和 DRAM 模块之间的总线。此数据总线宽度不一定与字长相关。

根据策略,首先获取实际请求的地址,然后依次获取缓存行的其余部分。

如果有一个 64 字节宽的总线似乎会快得多,这样可以一次获取整个缓存行。 (这将是单词大小的八倍)

可能有两种不同的数据总线宽度,一种用于标准缓存行提取,另一种用于仅适用于字大小内存访问的外部硬件 (DMA)。

限制数据总线大小的限制是什么?

我觉得有 physical/cost 麻烦。除了数据线 (64) 之外,还有地址线 (15+) 和 bank_select 线 (3)。加上其他线路(CS、CAS、RAS...)。例如,参见 6th Generation Intel® Core™ Processor Family Datasheet。一般情况下,一辆公交车约90条线路,两辆公交车约180条。还有其他线(PCIe,Dysplay...) 下一个方面是爆读。使用 bank_select 我们可以 select 8 个银行之一。在突发模式下,在所有银行写入一次地址,我们每个滴答按银行从所有银行读取数据。

我认为 DRAM 总线宽度在 AMD64 之前扩展到当前的 64 位。恰好和字号相符。 (P5 Pentium 已经 ,因为它可以使用其 64 位数据总线轻松做到这一点。当然,这仅适用于 x87(以及后来的 MMX)loads/stores 在该 32 位微体系结构上。)

见下文:High Bandwidth Memory 确实使用了更宽的总线,因为时钟的频率是有限的,在某些时候,让它大规模并行确实变得有利。

It would seem much faster if there was a bus with 64 byte width , which would allow to fetch a whole cache line at once.

Burst t运行sfer 大小不必与总线宽度相关。 T运行sfers to/from DRAM 确实发生在高速缓存行大小的突发中。 CPU 不必为每个 64 位发送单独的命令,只需设置整个缓存行(读或写)的突发 t运行sfer。如果它想要更少,它实际上必须发送 an abort-burst command;没有“单字节”或“单字”t运行sfer 命令。 (是的,SDRAM 维基文章仍然适用于 DDR3/DDR4。)

您是否认为需要更宽的总线以减少命令开销?他们不是。(SDRAM 命令是通过与数据分开的引脚发送的,因此可以对命令进行流水线处理,在当前突发的 t运行sfer 期间设置下一个突发。或者更早开始在另一个银行或芯片上打开一个新行(dram 页面)。DDR4 wiki 页面有一个 nice chart of commands,显示地址引脚如何对某些命令具有其他含义。)


高速并行总线很难设计。 CPU 插槽和每个 DRAM 插槽之间的主板上的所有走线必须在小于 1 个时钟周期内具有相同的传播延迟。这意味着它们的长度几乎相同,并控制到其他走线的电感和电容,因为 t运行 传输线效应在足够高的频率下非常重要。

极宽的总线会阻止您将其设置为高时钟,因为您无法达到相同的容限运行ces。 SATA 和 PCIe 都用高速串行总线取代了并行总线(IDE 和 PCI)。 (PCIe并行使用多条lane,但每条lane都是自己独立的link,只是并行总线的一部分。

从CPU插槽到DRAM插槽的每个通道使用512条数据线是完全不切实际的。典型的台式机/笔记本电脑 CPU 使用双通道内存控制器(因此两个 DIMM 可以同时做不同的事情),所以这将是主板上的 1024 条走线,以及 CPU 上的引脚插座。 (这是在固定数量的控制线之上,如 RAS、CAS 等。)

运行 真正 高时钟速度的外部总线确实会出现问题,因此需要在宽度和时钟速度之间进行权衡。


有关 DRAM 的更多信息,请参阅 Ulrich Drepper 的 What Every Programmer Should Know About Memory。它在 DRAM 模块、地址线和 mux/demuxers.

的硬件设计方面获得了惊人的技术性

请注意,RDRAM (RAMBUS) 使用高速 16 位总线,带宽高于 PC-133 SDRAM(1600MB/s 对 1066MB/s)。 (它有更糟糕的延迟和 运行 更热,并且由于一些技术和一些非技术原因在市场上失败了)。


我猜这有助于使用更宽的总线,达到您可以在单个周期内从物理 DRAM 芯片读取的宽度,因此您不需要那么多的缓冲(较低的延迟)。

Ulrich Drepper 的论文(linked 以上)证实了这一点:

Based on the address lines a2 and a3 the content of one column is then made available to the data pin of the DRAM chip. This happens many times in parallel on a number of DRAM chips to produce a total number of bits corresponding to the width of the data bus.


在CPU内,公交车更宽。 Core2 到 IvyBridge 在不同级别缓存之间以及从执行单元到 L1 之间使用 128 位数据路径。 Haswell widened that to 256b (32B), with a 64B path between L1 and L2


High Bandwidth Memory 被设计成与控制它的任何东西更紧密地耦合,并且每个通道使用 128 位总线,有 8 个通道。 (总带宽为 128GB/s)。 HBM2 的速度是原来的两倍,宽度相同。

8 个 128b 通道不是一个 1024b 总线,而是在拥有一个难以保持同步的极宽总线与将每个位放在单独的通道(如 PCIe)上的过多开销之间进行权衡。如果您需要强大的信号和连接器,单独通道上的每一位都很好,但是当您可以更好地控制事情时(例如,当内存未插入时),您可以使用宽的快速总线。


Perhaps there could be two different data bus widths, one for the standard cache line fetching and one for external hardware (DMA) that works only with word size memory access.

已经是这样了。 DRAM 控制器集成到 CPU,因此来自系统设备(如 SATA 控制器和网卡)的通信必须通过一条总线(PCIe)从它们到 CPU,然后到 RAM(DDR3/DDR4).

从 CPU 内部内存架构到系统其余部分的桥梁称为系统代理(这基本上取代了以前在没有集成内存控制器的系统中主板上的独立北桥芯片).芯片组南桥通过它提供的一些 PCIe 通道与其通信。

在多插槽系统上,缓存一致性流量和非本地内存访问也必须在插槽之间发生。 AMD 可能仍会使用 hypert运行sport(一种 64 位总线)。英特尔硬件在连接至强内部内核的环形总线上有一个额外的停靠点,这个额外的连接是其他套接字进出数据的地方。 IDK 物理总线的宽度。