STREAM OpenMP基准解释

时间:2017-05-14 12:06:23

标签: c multithreading openmp benchmarking shared-memory

此问题涉及 Intel Xeon E5-2650v4 处理器上 Stream Triad 结果的解释。该处理器有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万)双元素。我使用带有标志 -O3 -xHost 的英特尔 icc 17.0.1 ,并改变1 to 24的线程。我获得了Stream Triad的以下图表:Stream Triad for Xeon E5-2650v4。我的问题是:

  1. 获得的最大带宽约为114 GB/sec,但这超过76 GB/sec的理论最大带宽(请参阅Maximum Theoretical Bandwidth of E5-2650v4)。这怎么可能?

  2. 为什么 10个线程之后偶数奇数线程的带宽之间存在差异?

    < / LI>
  3. 12个线程(即114 GB/sec)获得最大带宽。是因为OpenMP会在一个套接字中自动生成6个线程,在第二个套接字中自动生成6个线程吗?

  4. STREAM报告此次运行需要大约734.2 MB个内存。一个插槽的RAM足以满足这一要求。那么内存是在socket 1还是socket 2上分配的(当阵列是连续的时候肯定不能拆分)?此外,如果内存被分配一个单个套接字,那么另一个套接字上的线程不会访问非本地内存(惩罚)吗?

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

1 个答案:

答案 0 :(得分:3)

  1. 两个插槽的理论内存带宽是其两倍。您还应该提及内存配置,以便对实现的理论带宽进行更具体的分析。
  2. 如果将奇数除以2(套接字),它们将永远不会获得相同数量的线程/工作,因此效率低下。
  3. 这是实施和操作系统特定的。默认情况下,Intel 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中读取/写入的线程触及它(因此将其分配给它{39} ; s NUMA节点)。