- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将线程 ping 到两个 CPU 插槽中的所有内核,并在线程之间写入通信而不写回 DRAM。
如果我只在一个插槽中使用内核,写回缓存对我的吞吐量来说会很好,但是对于两个插槽,我想知道是否有更快的东西,比如片上网络或英特尔 QuickPath 互连?
更重要的是,有没有什么简单的方法可以在不直接编写汇编代码的情况下利用这种特性?
引用:
https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/700477
最佳答案
TL:DR: 不,CPU 硬件已经针对一个核心存储和另一个核心加载进行了优化。您可以使用任何神奇的高性能低延迟方法来代替。如果写入端可以以某种方式强制回写到 L3,则可以减少读取端的延迟,但不幸的是,没有好的方法可以做到这一点(Tremont Atom 除外,见下文)。
共享的最后一级缓存已经支持一致性流量,避免了对 DRAM 的写入/重新读取。
不要被 MESI 图所迷惑;那些显示没有共享缓存的单级缓存。
在真正的 CPU 中,来自一个内核的存储只需写回最后一级缓存(现代 x86 中的 LLC = L3),其他内核的负载就可以访问它们。 L3可以容纳脏线;所有现代 x86 CPU 都具有回写 L3 而不是直写。
在现代多插槽系统上,每个插槽都有自己的内存 Controller (NUMA),因此窥探检测何时需要通过插槽之间的互连进行缓存->缓存传输。但是,是的,将线程固定到同一个物理内核确实可以改善内核间/线程间延迟。 (对于 AMD Zen 来说也是如此,其中 4 个内核的集群共享一 block LLC,在集群内/跨集群对内核间延迟很重要,即使在单个插槽内也是如此,因为没有一个大型 LLC 在所有内核之间共享。)
你不能做得比这更好;一个核心上的负载一旦到达 L3 并发现线路在另一个核心的私有(private) L1d 或 L2 中被修改,就会生成共享请求。这就是延迟高于 L3 命中的原因:加载请求必须在它甚至知道它不仅仅是 L3 命中之前获得 L3。但英特尔使用其大型共享包含 L3 缓存标签作为窥探过滤器,以跟踪芯片上的哪个内核可能已缓存它。 (这在 Skylake-Xeon 中发生了变化;它的 L3 不再包含,甚至不包含标签,并且必须有一些单独的窥探过滤器。)
另见 Which cache mapping technique is used in intel core i7 processor?
有趣的事实:在 Core 2 CPU 上,内核之间的流量确实与 some cases 中的 DRAM 一样慢,即使对于共享 L2 缓存的内核也是如此。
早期的 Core 2 Quad CPU 实际上是同一封装中的两个双核芯片,并且不共享最后一级缓存。那可能会更糟;如果“胶水”逻辑甚至可以在不写回 DRAM 的情况下对脏数据进行缓存->缓存传输,那么像这样的一些 CPU 就没有共享的 LLC 和 IDK。
但那些日子早已过去; 现代多核和多插槽 CPU 已针对内核间流量进行了优化。
你真的不能在读取方面做任何可以让任何事情变得更快的特殊事情。
如果您有 cldemote
在写入端,或以其他方式将数据驱逐回 L3,读取端可能只会获得 L3 命中。但那是 only available on Tremont Atom
x86 MESI invalidate cache line latency issue是另一个关于试图让写入端将缓存线驱逐回 L3 的问题,这是通过冲突未命中的问题。clwb
可能会减少读取端延迟,但缺点是它会强制回写到 DRAM,而不仅仅是 L3。 (在 Skylake-Xeon it does evict, like clflushopt
上。希望 IceLake 能给我们一个“真实的”clwb
。)
How to force cpu core to flush store buffer in c?是关于基本上相同的事情的另一个问题。
关于assembly - 有什么方法可以编写 Intel CPU 直接核对核通信代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58741806/
我是一名优秀的程序员,十分优秀!