2017-05-14 83 views
2

这个问题涉及上英特尔至强E5-2650v4处理器流三合会结果的解释。该处理器有2个插槽,每个插槽有12个内核。每个插座上的共享L3高速缓存是30 MB,即30/12 = 2.5 MB/core。因此,在OpenMP版本的STREAM基准阵列大小= 4 * ((30+30) * 1024 * 1024)/8 = 31,457,280中的双元素大约是32,000,000(3200万)的双元素。我使用英特尔icc 17.0.1与标志-O3 -xHost和变化1 to 24线程。我获得了Stream Triad的以下图表:Stream Triad for Xeon E5-2650v4。我的问题是:STREAM基准的OpenMP解释

  1. 所获得的最大带宽大约是114 GB/sec但是这是比76 GB/sec理论最大带宽(见Maximum Theoretical Bandwidth of E5-2650v4)更多。这怎么可能 ?

  2. 为什么要为甚至10线程数量的线程之间的带宽的变化?

  3. 12线程(即114 GB/sec)处获得最大带宽。是否因为OpenMP会自动产生一个套接字中的6个线程和第二个套接字中的6个线程?

  4. STREAM报告说它需要大约734.2 MB的内存用于此次运行。一个插座的RAM足以满足这个要求。那么内存将分配在套接字1还是套接字2上(由于数组是连续的,它肯定不能分割)?此外,如果内存分配了一个单一的套接字,那么另一个套接字上的线程将不会访问非本地内存(惩罚)?

我将不胜感激任何建议/解决方案。谢谢。

+0

2.最慢的线程决定整体运行时间。一旦套接字的内存通道饱和,添加更多的线程不会增加带宽,因此运行在那里的线程的运行时间会增加。使用13(6 + 7)和14(7 + 7)线程完成基准测试的时间大约相同,但在后一种情况下,数据量更大,因此带宽更高(高14/13倍)。这个差别随着线程总数的增加而减少为'1/n'。 –

+0

@HristoIliev:我同意每个插座概念的带宽饱和度。怀疑:总数据量不会保持不变吗?因为是否我在13个线程或14个线程之间划分了32,000,000个元素的数组,所传输的总数据量应该保持相等。 (我的数组大小固定为32,000,000个元素,即使线程数增加 - 我希望这是正确的)。 –

+1

您可以自己计算最大吞吐量。假设你有DDR4 @ 2400GHz。最大=(8 * 2400)* num_channels * num_sockets。因此,对于两个插槽和quod通道,这是153.5 GB/s,这是英特尔报价的两倍,因为它们只引用一个插座。你可以用'sudo dmidecode - t memory'找出你的记忆类型。现在您可以比DDR4 @ 2400 GHz更好,因此即使是单插槽,英特尔的最大报价也已过时。 –

回答

3
  1. 两个插座的理论存储带宽是其两倍。您还应该提及内存配置,以获得理论带宽的更具体分析。
  2. 如果将一个奇数除以二(套接字),它们将永远不会获得相同数量的线程/工作,因此效率低下。
  3. 这是实现和操作系统特定的。默认情况下,英特尔OpenMP运行时"will create 12 threads, running freely on the logical processors provided by the operating system"。这些数字清楚地表明,操作系统运行的线程分布在两个插座上。为了重现性和清晰度,您应手动控制线程关联度以进行度量,例如使用KMP_AFFINITY(英特尔专用)或OMP_PROC_BIND(通用)。
  4. 对于分配内存的NUMA放置而言,这并不一定重要。最常见的情况是,内存只分配到during the first access,然后决定放置哪个NUMA节点。这也是可配置/系统特定的。 STREAM无论如何均使用静态分配的内存,但在omp parallel for中对其进行初始化,以便后面将在另一个omp parallel for(因此将其分配给它的NUMA节点)中读取/写入的线程首先触及它。
+0

除了祖兰说过的话,请注意关于提高问题大小超过聚合最后一级缓存的规则。 – tim18

+3

与第3点相关:较新的Linux内核(3.10+)包含一个NUMA平衡机制,用于在NUMA节点之间迁移内存页面,使每个页面更接近访问它的线程。因此,将线程绑定到内核是绝对必要的。 –

+0

@ tim18:道歉,但我没有明确你的意思。 –