CPU 之间的通信是如何进行的?
How does the communication between CPU happen?
Another question about L2/L3 caches 说明 L3 可用于进程间通信 (IPC)。
是否还有其他 methods/pathways 可以实现此通信?
似乎还有其他途径的原因是英特尔在其最新处理器系列 (1.375 MiB per core in SKL-X) vs. previous generations (2.5 MiB per core in Broadwell EP) 中几乎将每个内核的 L3 缓存数量减半。
不过,每核专用 L2 从 256k 增加到 1M。
有inter-processor_interrupts,但这不是新的,一般的多线程软件不直接使用。内核可能会使用 IPI 将另一个内核从低功耗睡眠中唤醒,或者可能不会通知它在此 CPU 上的任务释放 OS 辅助锁后高优先级任务变得可运行/ 其他任务正在等待的互斥锁。
所以真的没有,没有其他途径。
减小的大小意味着如果您希望在消费者线程访问数据时它在 L3 中仍然很热,则必须将软件设计为更快地重用数据。但请注意,L3 中的唯一数据不太可能是一个内核写入的数据,接下来将由另一个内核读取;大多数多线程工作负载也涉及大量私有数据。另请注意,SKX L3 不是包容性的,因此共享的只读数据可以在使用它的内核的 L2 中保持热状态,即使它已从 L3 中逐出。
如果 L3 又大又快,那对开发人员来说真的很好,但事实并非如此。除了减小 L3 的大小外,SKX 的带宽和延迟也明显比 BDW 差。请参阅 @Mysticial's comments 关于 y-cruncher 性能的信息:
The L3 cache mesh on Skylake X only has about half the bandwidth of the L3 cache on the previous generation Haswell/Broadwell-EP processors. The Skylake X L3 cache is so slow that it's barely faster than main memory in terms of bandwidth. So for all practical purposes, it's as good as non-existant.
他不是在谈论线程之间的通信,而是在谈论独立线程的每个内核的有用缓存量。但是 AFAIK,producer/consumer 模型应该非常相似。
From the software optimization standpoint, the cache bottleneck brings a new set of difficulties. The L2 cache is fine. It is 4x larger than before and has doubled in bandwidth to keep up with the AVX512. But the L3 is useless. The net effect is that the usable cache per core is halved compared to the previous Haswell/Broadwell generations. Furthermore, doubling of the SIMD size with AVX512 makes the usable cache 4x smaller than before in terms of # of SIMD words that fit in cache.
考虑到所有这些,producer/consumer 线程是否命中 L3 或进入主内存可能不会产生巨大差异。幸运的是,如果有许多线程处于活动状态,DRAM 的速度非常快,总带宽也很高。单线程最大带宽还是比Broadwell低
线程间带宽基准数:
SiSoft 有 inter-core bandwidth and latency benchmark. Description here.
对于 10 核(20 线程)SKX(i9-7900X CPU @ 标称 3.30GHz),最高结果是一个 overclocked to 4.82GHz cores with 3.2GHz memory,达到 105.84 的聚合(?)带宽GB/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 shows only about 20GB/s for SKL-X for block sizes from 2MB to 8MB, pretty much exactly the same as main memory bandwidth. The Kaby Lake quad-core i7-7700k on the graph looks like maybe 60GB/s. It's not plausible that inter-thread bandwidth is higher than single-thread bandwidth for the SKX, unless SiSoft Sandra is counting loads + stores for the inter-thread case. (Single-thread bandwidth tends to suck on Intel many-core CPUs: see the "latency-bound platform" section of 。更高的 L3 延迟意味着带宽受限于未完成的 L1 或 L2 未命中/预取请求的数量。)
另一个复杂情况是,当 运行 启用超线程时,如果块大小足够小,则可能会通过 L1D / L2 进行一些线程间通信。参见 , and also 。
我不知道该基准测试如何将线程固定到逻辑内核,以及它们是否试图避免或最大化同一物理内核的逻辑内核之间的通信。
在设计多线程应用程序时,以每个线程内的内存局部性为目标。尽量避免在线程之间传递巨大的内存块,因为即使在之前的 CPU 中,这样的效率也很低。 SKL-AVX512 又名 SKL-SP 又名 SKL-X 又名 SKX 只会让它变得比以前更糟。
使用标志变量或进度计数器在线程之间同步。
如果线程之间的内存带宽是你最大的瓶颈,你应该
考虑只在生产者线程中完成工作(尤其是在写入数据时即时进行,而不是在单独的传递中进行),而不是完全使用单独的线程。即线程之间的边界之一可能不在您设计中的理想位置。
现实生活中的软件设计很复杂,有时您最终不得不在糟糕的选项中做出选择。
硬件设计也很复杂,有很多权衡取舍。尽管看起来 SKX 的 L3 缓存 + 网格似乎比中等核心数芯片的旧环形总线设置更差。据推测,对于某些类型的工作负载来说,这是最大芯片的胜利。希望后代会有更好的单核延迟/带宽。
Another question about L2/L3 caches 说明 L3 可用于进程间通信 (IPC)。
是否还有其他 methods/pathways 可以实现此通信?
似乎还有其他途径的原因是英特尔在其最新处理器系列 (1.375 MiB per core in SKL-X) vs. previous generations (2.5 MiB per core in Broadwell EP) 中几乎将每个内核的 L3 缓存数量减半。
不过,每核专用 L2 从 256k 增加到 1M。
有inter-processor_interrupts,但这不是新的,一般的多线程软件不直接使用。内核可能会使用 IPI 将另一个内核从低功耗睡眠中唤醒,或者可能不会通知它在此 CPU 上的任务释放 OS 辅助锁后高优先级任务变得可运行/ 其他任务正在等待的互斥锁。
所以真的没有,没有其他途径。
减小的大小意味着如果您希望在消费者线程访问数据时它在 L3 中仍然很热,则必须将软件设计为更快地重用数据。但请注意,L3 中的唯一数据不太可能是一个内核写入的数据,接下来将由另一个内核读取;大多数多线程工作负载也涉及大量私有数据。另请注意,SKX L3 不是包容性的,因此共享的只读数据可以在使用它的内核的 L2 中保持热状态,即使它已从 L3 中逐出。
如果 L3 又大又快,那对开发人员来说真的很好,但事实并非如此。除了减小 L3 的大小外,SKX 的带宽和延迟也明显比 BDW 差。请参阅 @Mysticial's comments 关于 y-cruncher 性能的信息:
The L3 cache mesh on Skylake X only has about half the bandwidth of the L3 cache on the previous generation Haswell/Broadwell-EP processors. The Skylake X L3 cache is so slow that it's barely faster than main memory in terms of bandwidth. So for all practical purposes, it's as good as non-existant.
他不是在谈论线程之间的通信,而是在谈论独立线程的每个内核的有用缓存量。但是 AFAIK,producer/consumer 模型应该非常相似。
From the software optimization standpoint, the cache bottleneck brings a new set of difficulties. The L2 cache is fine. It is 4x larger than before and has doubled in bandwidth to keep up with the AVX512. But the L3 is useless. The net effect is that the usable cache per core is halved compared to the previous Haswell/Broadwell generations. Furthermore, doubling of the SIMD size with AVX512 makes the usable cache 4x smaller than before in terms of # of SIMD words that fit in cache.
考虑到所有这些,producer/consumer 线程是否命中 L3 或进入主内存可能不会产生巨大差异。幸运的是,如果有许多线程处于活动状态,DRAM 的速度非常快,总带宽也很高。单线程最大带宽还是比Broadwell低
线程间带宽基准数:
SiSoft 有 inter-core bandwidth and latency benchmark. Description here.
对于 10 核(20 线程)SKX(i9-7900X CPU @ 标称 3.30GHz),最高结果是一个 overclocked to 4.82GHz cores with 3.2GHz memory,达到 105.84 的聚合(?)带宽GB/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 shows only about 20GB/s for SKL-X for block sizes from 2MB to 8MB, pretty much exactly the same as main memory bandwidth. The Kaby Lake quad-core i7-7700k on the graph looks like maybe 60GB/s. It's not plausible that inter-thread bandwidth is higher than single-thread bandwidth for the SKX, unless SiSoft Sandra is counting loads + stores for the inter-thread case. (Single-thread bandwidth tends to suck on Intel many-core CPUs: see the "latency-bound platform" section of
另一个复杂情况是,当 运行 启用超线程时,如果块大小足够小,则可能会通过 L1D / L2 进行一些线程间通信。参见
我不知道该基准测试如何将线程固定到逻辑内核,以及它们是否试图避免或最大化同一物理内核的逻辑内核之间的通信。
在设计多线程应用程序时,以每个线程内的内存局部性为目标。尽量避免在线程之间传递巨大的内存块,因为即使在之前的 CPU 中,这样的效率也很低。 SKL-AVX512 又名 SKL-SP 又名 SKL-X 又名 SKX 只会让它变得比以前更糟。
使用标志变量或进度计数器在线程之间同步。
如果线程之间的内存带宽是你最大的瓶颈,你应该 考虑只在生产者线程中完成工作(尤其是在写入数据时即时进行,而不是在单独的传递中进行),而不是完全使用单独的线程。即线程之间的边界之一可能不在您设计中的理想位置。
现实生活中的软件设计很复杂,有时您最终不得不在糟糕的选项中做出选择。
硬件设计也很复杂,有很多权衡取舍。尽管看起来 SKX 的 L3 缓存 + 网格似乎比中等核心数芯片的旧环形总线设置更差。据推测,对于某些类型的工作负载来说,这是最大芯片的胜利。希望后代会有更好的单核延迟/带宽。