这个问题涉及上英特尔至强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基准的OpenMP解释
所获得的最大带宽大约是
114 GB/sec
但是这是比76 GB/sec
理论最大带宽(见Maximum Theoretical Bandwidth of E5-2650v4)更多。这怎么可能 ?为什么要为甚至后10线程奇数量的线程之间的带宽的变化?
在
12
线程(即114 GB/sec
)处获得最大带宽。是否因为OpenMP会自动产生一个套接字中的6个线程和第二个套接字中的6个线程?STREAM报告说它需要大约
734.2 MB
的内存用于此次运行。一个插座的RAM足以满足这个要求。那么内存将分配在套接字1还是套接字2上(由于数组是连续的,它肯定不能分割)?此外,如果内存分配了一个单一的套接字,那么另一个套接字上的线程将不会访问非本地内存(惩罚)?
我将不胜感激任何建议/解决方案。谢谢。
2.最慢的线程决定整体运行时间。一旦套接字的内存通道饱和,添加更多的线程不会增加带宽,因此运行在那里的线程的运行时间会增加。使用13(6 + 7)和14(7 + 7)线程完成基准测试的时间大约相同,但在后一种情况下,数据量更大,因此带宽更高(高14/13倍)。这个差别随着线程总数的增加而减少为'1/n'。 –
@HristoIliev:我同意每个插座概念的带宽饱和度。怀疑:总数据量不会保持不变吗?因为是否我在13个线程或14个线程之间划分了32,000,000个元素的数组,所传输的总数据量应该保持相等。 (我的数组大小固定为32,000,000个元素,即使线程数增加 - 我希望这是正确的)。 –
您可以自己计算最大吞吐量。假设你有DDR4 @ 2400GHz。最大=(8 * 2400)* num_channels * num_sockets。因此,对于两个插槽和quod通道,这是153.5 GB/s,这是英特尔报价的两倍,因为它们只引用一个插座。你可以用'sudo dmidecode - t memory'找出你的记忆类型。现在您可以比DDR4 @ 2400 GHz更好,因此即使是单插槽,英特尔的最大报价也已过时。 –