加载/存储不会直接进入内存(除非您在不可缓存的内存区域上使用它们)。甚至 NT 存储也进入写入组合填充缓冲区。
加载/存储在执行单元和 L1D 缓存之间进行。CPU 内部具有从缓存到执行单元以及从 L1D 到外部缓存的宽数据路径。看看缓存怎么能这么快?在electronics.SE 上,关于英特尔IvyBridge。
例如,IvB 在执行单元和 L1D 之间有 128b 条数据路径。Haswell 将其扩大到 256 位。只要不跨越缓存线边界,未对齐的加载/存储就具有完整的性能。Skylake-AVX512 将其扩展到 512 位,因此它可以在单个时钟周期内执行 2 个 64 字节加载和 64 字节存储。(只要数据在 L1D 缓存中很热)。
包括 Ryzen 在内的 AMD CPU 在 128b 块中处理 256b 向量(甚至在执行单元中,与 Pentium M 之后的 Intel 不同)。较旧的 CPU(例如 Pentium III 和 Pentium-M)将 128b 加载/存储(和向量 ALU)分成两个 64 位半,因为它们的加载/存储执行单元只有 64 位宽。
内存控制器为 DDR2/3/4。总线为 64 位宽,但使用突发模式,突发大小为 64 字节(并非巧合,缓存线的大小。)
作为“64 位”CPU 与任何内部或外部数据总线的宽度无关。该术语过去确实用于其他 CPU,但即使是 P5 Pentium 也有 64 位数据总线。(对齐的 8 字节加载/存储保证是原子的,可以追溯到 P5,例如 x87 或 MMX 。)在这种情况下, 64 位是指指针的宽度,以及整数寄存器的宽度。
进一步阅读:
每个程序员都应该知道的关于内存的知识(但请注意,许多软件预取的东西已经过时了,现代 CPU 的硬件预取器比 Pentium4 更好)。仍然是必不可少的阅读材料,尤其是如果您想了解 CPU 是如何连接到 DDR2/3/4 内存的。
x86 标签 wiki中的其他性能链接。
增强了 memcpy 的 REP MOVSB,以获取有关 x86 内存带宽的更多信息。请特别注意,单线程带宽可能受到 max_concurrency / 延迟的限制,而不是 DRAM 控制器的限制,尤其是在多核 Xeon 上(L3 / 内存的延迟更高)。