有什么方法可以编写Intel CPU直接核心到核心通信代码?

问题描述 投票:0回答:1

我想将线程ping通到两个CPU插槽中的所有内核,并在线程之间写入通信,而无需写回DRAM。

如果仅在一个插槽中使用内核,那么写回高速缓存对于我的吞吐量就可以了,但是对于两个插槽,我想知道是否有更快的速度,例如在芯片网络或Intel QuickPath互连上?

此外,有什么简单的方法可以利用这种功能而无需直接编写汇编代码?

ref:https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/700477

assembly x86 cpu intel cpu-architecture
1个回答
0
投票

TL:DR:否,CPU硬件已经针对一个内核存储和另一内核加载进行了优化。没有可替代的神奇的高性能低延迟方法。如果写端可以以某种方式强制回写到L3,则可以减少读端的延迟,但是不幸的是,没有做到这一点的好方法(Tremont Atom除外,请参见下文)。


共享的最后一级缓存已经支持了一致性流量,避免了写入/重新读取到DRAM。

不要被MESI图欺骗;它们显示没有共享缓存的单级缓存。

在实际的CPU中,一个核心的存储只需要写回到最后一级的缓存(现代x86中的LLC = L3),其他核心的负载才能访问它们。 L3可以容纳脏线;所有现代x86 CPU都具有不可写回的L3。

在现代的多套接字系统上,每个套接字都有其自己的内存控制器(NUMA),因此侦听可检测何时需要在套接字之间的互连上进行cache-> cache传输。但是可以,将线程固定到同一物理内核确实可以改善内核间/线程间延迟。 (对于AMD Zen,类似地,四个内核的群集共享一个LLC块,即使在单个套接字内,群集内/群集间的内核间延迟也很重要,因为所有内核之间没有共享一个大的LLC。)

您不能做得比这更好;一旦一个核心上的负载到达L3,并在另一核心的私有L1d或L2中发现线路已修改,就会生成共享请求。这就是为什么延迟时间比L3命中率高的原因:加载请求必须先获得L3才能知道它不仅仅是L3命中。但是,英特尔将其大型共享的[[inclusiv]] L3缓存标签用作探听过滤器,以跟踪芯片上可能缓存了哪个内核。 (在Skylake-Xeon中已更改;它的L3不再包含在内,甚至不包含标签,并且必须具有一些单独的探听过滤器。)另请参阅Which cache mapping technique is used in intel core i7 processor?


有趣的事实:在核心2 CPU上,核心之间的流量确实和some cases中的DRAM一样慢

早期的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可能会减少读取侧延迟,但缺点是它

force

回写到DRAM。
© www.soinside.com 2019 - 2024. All rights reserved.