我正在调整我的并行 Java 程序的性能。我对建筑效果很好奇。
给定一台有两个 CPU 插槽的机器,每个插槽都有一个四核 Intel Xeon CPU,然后:
- 两个 CPU 是如何通信的,它们的通信速度有多快?
- 同一芯片上的两个内核的通信速度有多快?
- 同一芯片上的四个内核在通信或内存访问方面是否等效?
我正在调整我的并行 Java 程序的性能。我对建筑效果很好奇。
给定一台有两个 CPU 插槽的机器,每个插槽都有一个四核 Intel Xeon CPU,然后:
如何将线程调度到内核以接近最佳内存性能取决于对内存的访问模式,通常不值得麻烦。如果您的程序是用 Java 编写的,那么您可能无法获得接近最佳性能所需的控制级别。
现代 CPU 具有集成内存控制器,现代多插槽系统具有分布式内存。这就是所谓的
在现代多插槽英特尔处理器中,插槽之间的通信是使用 QPI 完成的
QPI 是指定其工作方式的英特尔架构。AMD 的等价物是 HyperTransport。您可以在此处了解有关各种架构的更多信息:
对 1 级数据缓存中未命中的内存的访问可能由 2 级数据缓存(在同一个套接字中)提供服务,或者由英特尔所谓的“最后一级缓存 (LLC)”提供服务,该缓存位于具有该内存地址的内存控制器的套接字。在另一个插槽中访问 LLC 可能需要几十个处理器周期,但仍然比访问 DRAM(超过一百个处理器周期)快得多。
1) 两个 CPU 是如何通信的,它们的通信速度有多快?
大多数时候,它们通过内存或最近的共享内存层次结构级别进行通信。(SMP 和 NUMA 上的系统内存都被视为共享级别;即使在 NUMA 中它是通过另一个芯片的内存控制器访问。这只是 Non-Uniform=较慢的访问)
2) 同一芯片上的两个内核的通信速度有多快?
同一芯片上的内核通常共享 L2 或 L3 缓存。不同芯片上的内核通过内存或使用缓存一致性协议的缓存到缓存交互进行通信。
因此,如果 1(不同的芯片)在 CPU 之间传递的内存速度(带宽)将接近普通内存读/写。在情况 2(相同芯片)中,这个速度可以更大,最高可达缓存读/写速度。
在案例 1 中,通信延迟将是数百个 CPU 滴答声,在案例 2 中将是几十个。
3) 同一芯片上的四个内核在通信或内存访问方面是否等效?
同一芯片的所有四个内核通常与 RAM 具有相同的距离。这取决于芯片架构和实现;对于一些较旧的英特尔,例如多核芯片实际上是将两个芯片封装在一个封装中。