此问题涉及 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的以下图表:。我的问题是:
获得的最大带宽约为114 GB/sec
,但这超过76 GB/sec
的理论最大带宽(请参阅Maximum Theoretical Bandwidth of E5-2650v4)。这怎么可能?
为什么 10个线程之后偶数和奇数线程的带宽之间存在差异?
< / LI>在12
个线程(即114 GB/sec
)获得最大带宽。是因为OpenMP会在一个套接字中自动生成6个线程,在第二个套接字中自动生成6个线程吗?
STREAM报告此次运行需要大约734.2 MB
个内存。一个插槽的RAM足以满足这一要求。那么内存是在socket 1还是socket 2上分配的(当阵列是连续的时候肯定不能拆分)?此外,如果内存被分配一个单个套接字,那么另一个套接字上的线程不会访问非本地内存(惩罚)吗?
我将不胜感激任何建议/解决方案。谢谢。
答案 0 :(得分:3)
KMP_AFFINITY
(特定于英特尔)或OMP_PROC_BIND
(通用)。omp parallel for
中初始化它,以便稍后在另一个omp parallel for
中读取/写入的线程触及它(因此将其分配给它{39} ; s NUMA节点)。