x86 无法进行绕过或通过 L1D/L2 写入但在 L3 停止的存储。有些 NT 存储会绕过所有缓存。任何东西forces回写到 L3 也会强制回写到内存。 (例如clwb
操作说明)。它们专为非易失性 RAM 使用案例或非一致性 DMA 而设计,在这些情况下,将数据提交到实际 RAM 非常重要。
(更新:特里蒙特/蓝宝石急流有cldemote
。早期的硬件将其作为 NOP 运行,因此它可以用作提示。)
也没有办法绕过 L1D 进行加载(除了 WC 内存,例如带有 SSE4.1 的视频 RAM)movntdqa
,但它在其他内存类型上并不“特殊”)。prefetchNTA
根据Intel的优化手册,可以绕过L2。 (并在具有非包容性 L3 缓存的 Xeon 上绕过 L3。)
执行读取操作的核心上的预取应该有助于触发从其他核心写回到 L3,并传输到您自己的 L1D。但只有在加载之前准备好地址时,这才有用。 (数十到数百次循环才能发挥作用。)
Intel CPU 使用共享包括的L3 缓存作为片上缓存一致性的后盾。 2 插槽必须监听另一个插槽,但支持 2P 以上的 Xeon 具有监听过滤器来跟踪移动的缓存行。 (这里描述的是 Broadwell Xeon v4,而不是 Skylake 和后来的 Xeon Scalable 的重新设计。)
当您读取最近由另一个内核写入的一行时,它在您的 L1D 中始终是无效的。 L3 是包含标签的,它的标签有额外的信息来跟踪哪个核心有该线路。 (即使该线路在某个 L1D 中处于 M 状态,这也是如此,这要求它在 L3 中无效,根据正常MESI https://en.wikipedia.org/wiki/MESI_protocol因此,在缓存未命中检查 L3 标签后,它会触发对 L1 的请求,该请求具有将其写回到 L3 缓存的行(并且可能将其直接发送到核心而不是想要它)。
Skylake-X (Skylake-AVX512) 没有包容性 L3(它有一个更大的私有 L2 和一个较小的 L3),但它仍然具有包含标签的结构来跟踪哪个核心有线路。它还使用网状结构而不是环状结构,L3 延迟似乎明显比 Broadwell 差。 (特别是在第一代 Skylake 中;我认为 Ice Lake 和后来的 Xeon 中的情况没那么糟糕。)
可能有用:使用直写式缓存策略映射共享内存区域的延迟关键部分。我不知道这个补丁是否已进入主线 Linux 内核,但请参阅HP 的此补丁:支持 x86 上的直写式映射 https://lwn.net/Articles/646081/。 (正常政策是WB。)
还相关:主内存和缓存性能
英特尔 Sandy Bridge 和 AMD Bulldozer https://tu-dresden.de/zih/forschung/ressourcen/dateien/abgeschlossene-projekte/benchit/2014_MSPC_authors_version.pdf?lang=en,深入研究 2 插槽 SnB 上不同起始状态的缓存行的延迟和带宽。
有关 Intel CPU 上内存带宽的更多信息,请参阅memcpy 的增强型 REP MOVSB https://stackoverflow.com/questions/43343231/enhanced-rep-movsb-for-memcpy,尤其是延迟受限平台部分。 (只有 10 个 LFB 限制了单核带宽)。
有关的:生产者-消费者在超级兄弟与非超级兄弟之间共享内存位置的延迟和吞吐量成本是多少? https://stackoverflow.com/questions/45602699/what-are-the-latency-and-throughput-costs-of-producer-consumer-sharing-of-a-memo有一些实验结果,让一个线程将垃圾邮件写入某个位置,而另一个线程读取该位置。
请注意,缓存未命中本身并不是唯一的影响。你也会得到很多machine_clears.memory_ordering
来自执行负载的核心的错误推测。 (x86 的内存模型是强顺序的,但真实的 CPU 会推测性地提前加载,并在极少数情况下中止,即缓存行在加载应该“发生”之前变得无效。
还相关:
-
有没有办法编写Intel CPU直接核对核通信代码? https://stackoverflow.com/questions/58741806/is-there-any-way-to-write-for-intel-cpu-direct-core-to-core-communication-code(否,IPI 中断除外)
-
为什么 x86 不实现直接的核心到核心消息传递汇编/CPU 指令? https://stackoverflow.com/questions/72206733/why-didnt-x86-implement-direct-core-to-core-messaging-assembly-cpu-instructions- UIPI 现在存在于 Sapphire Rapids:用户空间处理器间中断。