gpt4 book ai didi

multithreading - x86_64 CPU 是否使用相同的缓存线通过共享内存在 2 个进程之间进行通信?

转载 作者:行者123 更新时间:2023-12-04 06:46:29 24 4
gpt4 key购买 nike

众所周知,现代 x86_64 上所有级别的缓存 L1/L2/L3 是 virtually indexed, physically tagged .并且所有内核通过 QPI/HyperTransport 上的缓存一致性协议(protocol) MOESI/MESIF 通过 Last Level Cache - cache-L3 进行通信。

例如,Sandybridge 系列 CPU 具有 4 - 16 路缓存 L3 和 page_size 4KB,然后这允许通过共享内存在不同内核上执行的并发进程之间交换数据。这是可能的,因为高速缓存 L3 不能同时包含与进程 1 的页面和进程 2 的页面相同的物理内存区域。

这是否意味着每次 process-1 请求相同的共享内存区域时,process-2 将其 page 的 cache-lines 刷新到 RAM 中,然后 process-1 加载与 page 的 cache-lines 相同的内存区域在进程1的虚拟空间中?它真的很慢还是处理器使用了一些优化?

现代 x86_64 CPU 是否使用相同的缓存行,没有任何刷新,通过共享内存在具有不同虚拟空间的 2 个进程之间进行通信?

Sandy Bridge Intel CPU - 高速缓存 L3:

  • 8 MB - 缓存大小
  • 64 B - 高速缓存行大小
  • 128 K - 行 (128 K = 8 MB/64 B)
  • 16路
  • 8 K - 路数组(8 K = 128 K 线/16 路)
  • 13 位 [18:6] - 虚拟地址(索引)定义当前集合号 (这是标签)
  • 512 K - 每个相同(虚拟地址/512 K)竞争同一组(8 MB/16 路)
  • 低 19 位 - 用于确定当前集数
  • 4 KB - 标准页面大小
  • 只有低 12 位 - 在虚拟和物理地址中相同 对于每个地址

  • 我们有 7 个缺失位 [18:12] - 即我们需要检查 (7^2 * 16-way) = 1024 个缓存行。这与 1024 路缓存相同 - 所以这非常慢。这是否意味着缓存 L3 是(物理索引,物理标记)?

    标签的虚拟地址中缺失位的摘要(页面大小 8 KB - 12 位):
  • L3(8 MB = 64 B x 128 K 行),16 路,8 K 组,13 位标签 [18:6] - 缺少 7 位
  • L2(256 KB = 64 B x 4 K 行),8 路,512 组,9 位标签 [14:6] - 缺少 3 位
  • L1(32 KB = 64 B x 512 行),8 路,64 组,6 位标签 [11:6] - 无丢失位

  • 它应该是:
  • L3/L2(物理索引,物理标记)在 TLB 查找后使用
  • L1(虚拟索引,物理标记)

  • enter image description here

    最佳答案

    This is possible because cache L3 can't contain the same physicalmemory area as page of process 1 and as page of process 2 at the sametime.


    啊,啥?如果两个进程都有一个页面映射,它们都可以在缓存中命中同一行物理内存。
    这是英特尔多核设计使用大型包容性 L3 缓存的部分优势。一致性只需要检查 L3 标签以在另一个内核的 L2 或 L1 缓存中找到处于 E 或 M 状态的缓存行。
    在两个内核之间获取数据只需要回写到 L3。我忘记了这是在哪里记录的。也许 http://agner.org/optimize/What Every Programmer Should Know About Memory? .或者对于不共享任何级别缓存的内核,您需要在缓存层次结构的同一级别的不同缓存之间进行传输,作为一致性协议(protocol)的一部分。即使线路“脏”,这也是可能的,新所有者负责最终写回与 DRAM 不匹配的内容。

    映射到不同虚拟地址的同一高速缓存行将始终位于同一组 L1 高速缓存中。请参阅评论中的讨论:L2/L3 缓存是物理索引和物理标记的,因此别名永远不会成为问题。 (只有 L1 可以从虚拟索引中获得速度优势。在地址转换完成之前不会检测到 L1 缓存未命中,因此物理地址可以及时准备好探测更高级别的缓存。)
    另请注意,评论中的讨论错误地提到 Skylake 降低了 L1 缓存的关联性。事实上,它是 天湖L2 与以前相比,关联性较低的缓存(4 路,低于 SnB/Haswell/Broadwell 中的 8 路)。 L1 仍然是 32kiB 8 路:保持页面选择地址位在索引之外的关联性的最大大小。所以毕竟没有什么神秘的。
    另见 another answer to this question about HT threads on the same core communicating through L1 .我在那里说了更多关于缓存方式和集合的信息。

    关于multithreading - x86_64 CPU 是否使用相同的缓存线通过共享内存在 2 个进程之间进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33974193/

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