gpt4 book ai didi

x86-64 - SIMD 固有和内存总线大小 - CPU 如何在一次内存读取中获取所有 128/256 位?

转载 作者:行者123 更新时间:2023-12-05 09:17:38 36 4
gpt4 key购买 nike

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

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

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

最佳答案

加载/存储不会直接到内存(除非您在不可缓存的内存区域上使用它们)。甚至 NT 存储也进入写入组合填充缓冲区。

加载/存储在执行单元和 L1D 缓存之间进行。 CPU 内部具有从高速缓存到执行单元以及从 L1D 到外部高速缓存的宽数据路径。参见 How can cache be that fast?关于 electronics.SE,关于 Intel IvyBridge。

例如IvB 在执行单元和 L1D 之间有 128b 条数据路径。 Haswell 将其扩展到 256 位。未对齐的加载/存储只要不跨越高速缓存行边界就具有完整的性能。 Skylake-AVX512 将其扩展到 512 位,因此它可以在单个时钟周期内执行 2 个 64 字节加载和 1 个 64 字节存储。 (只要数据在 L1D 缓存中是热的)。

包括 Ryzen 在内的 AMD CPU 在 128b block 中处理 256b 向量(甚至在执行单元中,不像奔腾 M 之后的英特尔)。较旧的 CPU(例如 Pentium III 和 Pentium-M)将 128b 加载/存储(和向量 ALU)拆分为两个 64 位的一半,因为它们的加载/存储执行单元只有 64 位宽。

内存 Controller 是 DDR2/3/4。总线为 64 位宽,但使用突发模式,突发大小为 64 字节(并非巧合,是缓存行的大小。)

作为“64 位”CPU 与任何内部或外部数据总线的宽度无关。该术语过去确实用于其他 CPU,但即使 P5 Pentium 也有 64 位数据总线。 (aligned 8-byte load/store is guaranteed atomic as far back as P5, e.g. x87 or MMX。)这种情况下的 64 位是指指针和整数寄存器的宽度。


进一步阅读:

  • David Kanter's Haswell deep dive比较 Haswell 与 SnB 内核中的数据路径宽度。

  • What Every Programmer Should Know About Memory (但请注意,许多软件预取的东西已经过时,现代 CPU 具有比 Pentium4 更好的 HW 预取器)。仍然是必不可少的阅读 Material ,特别是如果您想了解 CPU 如何连接到 DDR2/3/4 内存。

  • x86 tag wiki 中的其他性能链接.

  • Enhanced REP MOVSB for memcpy有关 x86 内存带宽的更多信息。请特别注意,单线程带宽可能受最大并发/延迟限制,而不是 DRAM Controller ,尤其是在多核 Xeon 上(到 L3/内存的延迟更高)。

关于x86-64 - SIMD 固有和内存总线大小 - CPU 如何在一次内存读取中获取所有 128/256 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47512527/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com