1

你好论坛 - 我有一些关于 SIMD 内在函数的类似/相关问题,我在网上搜索了这些问题,包括 stackoverflow,但没有找到好的答案,因此请求您的帮助。

基本上,我试图了解 64 位 CPU 如何在一次读取中获取所有 128 位,以及这种操作的要求是什么。

  1. CPU 会在一次内存操作中从内存中获取所有 128 位,还是会执行两次 64 位读取?
  2. CPU 制造商是否需要特定大小的内存总线,例如,对于 64 位 CPU,英特尔是否需要 128 位总线来进行 SSE 内存绑定操作?
  3. 这些操作是否取决于内存总线大小、通道数和内存模块数?
4

1 回答 1

6

加载/存储不会直接进入内存(除非您在不可缓存的内存区域上使用它们)。甚至 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 / 内存的延迟更高)。

于 2017-11-27T14:04:41.573 回答