caching - 为什么没有与缓存线大小一样宽的数据总线?

标签 caching memory cpu-architecture cpu-cache micro-architecture

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

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

编辑:在这种情况下,“数据总线”是指 CPU 芯片和 DRAM 模块之间的总线。该数据总线宽度不一定与字长相关。

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

如果有一个 64 字节宽度的总线,它会更快,这将允许一次获取整个缓存行。 (这将是字大小的八倍)

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

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

最佳答案

我认为 DRAM 总线宽度扩展到 AMD64 之前的当前 64 位。巧合的是它与字号匹配。 (P5 Pentium 已经 guaranteed atomicity of 64-bit aligned transfers ,因为它可以通过其 64 位数据总线轻松做到这一点。当然,这仅适用于该 32 位微体系结构上的 x87(以及后来的 MMX)加载/存储。)
见下文: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.


突发传输大小不必与总线宽度相关。与 DRAM 之间的传输确实发生在缓存行大小的突发中。 CPU 不必为每个 64 位发送单独的命令,只需设置整个缓存行的突发传输(读或写)。如果它要少,它实际上必须发送an abort-burst command ;没有“单字节”或“单字”传输命令。 (是的,SDRAM wiki 文章仍然适用于 DDR3/DDR4。)
您是否认为需要更宽的总线来减少命令开销?他们不是。 (SDRAM 命令通过与数据分开的引脚发送,因此可以对命令进行流水线处理,在当前突发传输期间设置下一个突发。或者在打开另一组或芯片上的新行(dram 页)时更早开始。 DDR4 wiki 页面有一个 nice chart of commands ,显示地址引脚如何对某些命令具有其他含义。)

高速并行总线很难设计。主板上 CPU 插槽和每个 DRAM 插槽之间的所有走线必须在小于 1 个时钟周期内具有相同的传播延迟。这意味着它们的长度几乎相同,并控制其他迹线的电感和电容,因为传输线效应在足够高的频率下非常有用。
一辆极宽的公共(public)汽车会阻止你把它计时得这么高 ,因为您无法达到相同的公差。 SATA 和 PCIe 都用高速串行总线取代了并行总线(IDE 和 PCI)。 (PCIe 并行使用多个 channel ,但每个 channel 都是自己独立的链路,而不仅仅是并行总线的一部分)。
从 CPU 插槽到 DRAM 插槽的每个 channel 使用 512 条数据线是完全不切实际的 .典型的台式机/笔记本电脑 CPU 使用双 channel 内存 Controller (因此两个 DIMM 可以同时做不同的事情),因此这将是主板上的 1024 条迹线和 CPU 插槽上的引脚。 (这是在固定数量的控制线之上,如 RAS、CAS 等。)
以非常高的时钟速度运行外部总线确实会出现问题,因此需要在宽度和时钟速度之间进行权衡。

有关 DRAM 的更多信息,请参阅 Ulrich Drepper 的 What Every Programmer Should Know About Memory .它在 DRAM 模块、地址线和复用器/解复用器的硬件设计方面获得了令人惊讶的技术。
请注意 RDRAM (RAMBUS)使用高速 16 位总线,带宽高于 PC-133 SDRAM(1600MB/s 与 1066MB/s)。 (它有更糟糕的延迟和运行更热,并且由于一些技术和一些非技术原因在市场上失败了)。

我想这有助于使用更宽的总线,达到您可以在单个周期内从物理 DRAM 芯片读取的内容的宽度,因此您不需要那么多缓冲(更低的延迟)。
Ulrich Drepper 的论文(上面链接)证实了这一点:

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 在不同级别的缓存之间使用 128 位数据路径,从执行单元到 L1。 Haswell widened that to 256b (32B), with a 64B path between L1 and L2

High Bandwidth Memory 被设计为与控制它的任何东西更紧密地耦合,并为每个 channel 使用 128 位总线,有 8 个 channel 。 (总带宽为 128GB/s)。 HBM2 速度快两倍,宽度相同。
8 个 128b channel 不是一个 1024b 总线,而是在拥有一个难以保持同步的极宽总线与每个位在单独 channel (如 PCIe)上的开销过多之间进行权衡。如果您需要强大的信号和连接器,单独 channel 上的每一位都很好,但是当您可以更好地控制事物时(例如,当内存未插入时),您可以使用宽快速总线。

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 Controller 集成到 CPU 中,因此来自 SATA Controller 和网卡等系统设备的通信必须通过一条总线 (PCIe) 从它们到达 CPU,然后到达 RAM (DDR3/DDR4)。
从 CPU 内存架构到系统其余部分的桥接称为系统代理(这基本上取代了过去在没有集成内存 Controller 的系统中主板上的独立北桥芯片)。芯片组南桥通过它提供的一些 PCIe channel 与其通信。
Skylake system agent diagram, from IDF via ARStechnica
在多插槽系统上,缓存一致性流量和非本地内存访问也必须发生在插槽之间。 AMD 可能仍会使用超传输(64 位总线)。英特尔硬件在连接至强内部内核的环形总线上有一个额外的停靠点,这个额外的连接是其他套接字的数据进出的地方。 IDK 物理总线的宽度。

关于caching - 为什么没有与缓存线大小一样宽的数据总线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39182060/

相关文章:

php - W3 Total Cache - 允许编辑者从缓存中清除单个帖子

caching - 什么是分布式缓存?

c++ - 在堆栈上复制成员值或使用指针访问它?

cpu-architecture - 真实世界模拟到 TIS-100

algorithm - P 与 NP 是否与经典计算机与量子计算机可解决的问题相同?

python - Redis 与 Disk 在缓存应用程序中的性能

javascript - 是否可以为提供 JS 内容的 PHP 文件指定缓存验证器?

javascript - 一旦内存达到 4GB 标记,如何防止 Microsoft Edge 重新加载我的页面?

python - 如何释放 Pandas 数据框使用的内存?

cpu-architecture - 拥有比有效地址大的虚拟地址有什么意义?