Another question about L2/L3 caches解释说L3可以用于进程间通信(IPC)。
这种沟通还有其他方法/途径吗?
似乎存在其他途径的原因是因为英特尔在其最新处理器阵容(1.375 MiB per core in SKL-X)中与前几代(2.5 MiB per core in Broadwell EP)相比,每个核心的L3缓存数量几乎减半。 / p>
但是,每个核心私有L2从256k增加到1M。
答案 0 :(得分:1)
有inter-processor_interrupts,但这不是新的,并且不会被普通的多线程软件直接使用。内核可能会使用IPI从低功耗睡眠中唤醒另一个核心,或者在此CPU上的任务释放其他任务正在等待的操作系统辅助锁定/互斥锁后,可能不会通知它高优先级任务变为可运行
所以真的没有,没有其他途径。
缩小尺寸意味着您必须设计软件,以便在消费者线程到达时,如果您希望它在L3中仍然很热,可以更快地重用数据。但请注意,L3中唯一的数据不太可能是由一个核心写入的数据,接下来会被另一个核心读取;大多数多线程工作负载也涉及大量私有数据。另请注意,SKX L3不包含在内,因此共享只读数据在使用它的核心L2中仍然很热,即使它已从L3中逐出。
对于开发人员来说,如果L3是巨大且快速的,那将是非常好的,但它不是。除了L3的尺寸减小之外,SKX中的带宽和延迟也明显差于BDW。有关y-cruncher效果,请参阅@Mysticial's comments:
Skylake X上的L3缓存网格仅具有上一代Haswell / Broadwell-EP处理器上L3缓存的一半带宽。 Skylake X L3缓存非常慢,在带宽方面它几乎不比主内存快。因此,出于所有实际目的,它与不存在一样好。
他不是在谈论线程之间的通信,而是谈论独立线程的每个核心的有用缓存量。但AFAIK,一个生产者/消费者模型应该非常相似。
从软件优化的角度来看,缓存瓶颈带来了一系列新的困难。 L2缓存很好。它比以前大4倍,带宽加倍,以跟上AVX512的步伐。但L3是无用的。实际效果是,与之前的Haswell / Broadwell产品相比,每个核心的可用缓存减少了一半。此外,使用AVX512将SIMD大小加倍,使得可用缓存比适合缓存的SIMD字数小4倍。
考虑到所有这些,生成器/消费者线程是在L3中命中还是转到主内存可能没有太大的区别。幸运的是,如果许多线程处于活动状态,则DRAM的聚合带宽很高。单线程最大带宽仍然低于Broadwell。
SiSoft有一个inter-core bandwidth and latency benchmark。说明here。
对于10核(20线程)SKX(i9-7900X CPU @ nominal 3.30GHz),最高结果是一个overclocked to 4.82GHz cores with 3.2GHz memory,实现105.84GB / s的聚合(?)带宽和延迟54.9ns。
最低结果之一是4GHz/4.5GHz cores, and 2.4GHz IMC:66.11GB / s带宽,76.6ns延迟。 (滚动到页面底部以查看同一CPU的其他提交。)
相比之下,台式机Skylake i7-6700k(4C 8T 4.21GHz,4.1GHz IMC)scores 35.51GB/s and 40.5ns。一些超频结果是42.72GB / s和36.3ns。
对于一对线程,我认为SKL-desktop比SKX更快。我认为这个基准测试是测量10C / 20T CPU上20个线程之间的总带宽。
此single-threaded benchmark仅显示SKL-X的大约20GB / s,块大小从2MB到8MB,几乎与主内存带宽完全相同。图表上的Kaby Lake四核i7-7700k看起来可能是60GB / s。除非SiSoft Sandra为线程间案例计算负载+存储,否则线程间带宽高于SKX的单线程带宽是不可信的。 (单线程带宽往往会影响英特尔多核CPU:请参阅"延迟约束平台" this answer部分。更高的L3延迟意味着带宽受到未完成的L1数量的限制L2未命中/预取请求。)
另一个复杂因素是,当启用超线程运行时,如果块大小足够小,则可能通过L1D / L2发生一些线程间通信。请参阅What will be used for data exchange between threads are executing on one Core with HT?以及What are the latency and throughput costs of producer-consumer sharing of a memory location between hyper-siblings versus non-hyper siblings?。
我不知道该基准测试引脚如何与逻辑内核串联,以及它们是否试图避免或最大化同一物理内核的逻辑内核之间的通信。
在设计多线程应用程序时,针对每个线程中的内存位置。尽量避免在线程之间传递大量内存,因为即使在以前的CPU中效率也会降低。 SKL-AVX512又名SKL-SP又名SKL-X又称SKX让它变得比以前更糟。
使用标志变量或进度计数器在线程之间进行同步。
如果线程之间的内存带宽是您最大的瓶颈,那么您应该这样做 考虑只是在生产者线程中进行工作(尤其是在写入数据时,而不是在单独的传递中),而不是使用单独的线程。也就是说,线程之间的边界之一可能不在你设计的理想位置。
现实生活中的软件设计很复杂,有时你最终不得不在糟糕的选择中做出选择。
硬件设计也很复杂,需要进行大量权衡。虽然看起来SKX的L3缓存+网格似乎比中等核心数芯片的旧环网设置更差。据推测,对于某些类型的工作负载而言,这是最大筹码的胜利。希望后代将拥有更好的单核延迟/带宽。