Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何使用Intel Turbo Boost修改多核处理器的流基准(MPI)?_Performance_Mpi_Benchmarking_Hpc_Memory Bandwidth - Fatal编程技术网

Performance 如何使用Intel Turbo Boost修改多核处理器的流基准(MPI)?

Performance 如何使用Intel Turbo Boost修改多核处理器的流基准(MPI)?,performance,mpi,benchmarking,hpc,memory-bandwidth,Performance,Mpi,Benchmarking,Hpc,Memory Bandwidth,我想在集群的一个节点上运行,以测量不同数量MPI进程的可持续带宽。每个节点由两个Intel®Xeon®处理器E5-2680 v3(12核)组成 在下文中,我将使用openmpi v以MByte/s为单位展示triad测试的结果。1.8.2和选项map by core。源代码是使用 icc (ICC) 15.0.0 20140723 使用编译器选项 -O3 -xHost. 每个核心都使用了长度为2*10^6的双精度阵列,测试重复50次: 01: Triad: 22017.3438 02: Tr

我想在集群的一个节点上运行,以测量不同数量MPI进程的可持续带宽。每个节点由两个Intel®Xeon®处理器E5-2680 v3(12核)组成

在下文中,我将使用openmpi v以MByte/s为单位展示triad测试的结果。1.8.2和选项
map by core
。源代码是使用

icc (ICC) 15.0.0 20140723
使用编译器选项

-O3 -xHost.
每个核心都使用了长度为2*10^6的双精度阵列,测试重复50次:

01: Triad: 22017.3438
02: Triad: 29757.8394
03: Triad: 30224.1759
04: Triad: 30080.7369
05: Triad: 30209.6233
06: Triad: 30028.2044
07: Triad: 35064.7215
09: Triad: 44961.7710
10: Triad: 49721.1975
11: Triad: 54814.0579
12: Triad: 58962.7279
13: Triad: 64405.3634
14: Triad: 69330.3864
15: Triad: 74137.0623
16: Triad: 78838.8075
17: Triad: 84006.1067
18: Triad: 89012.6674
19: Triad: 94105.8690
20: Triad: 98744.3634
21: Triad: 103948.1538
22: Triad: 108055.3862
23: Triad: 114154.4542
24: Triad: 118730.5429
让我困惑的是,2-6个进程的测量可持续带宽停滞不前。我认为所用处理器的涡轮增压可能会使结果产生偏差。显然,涡轮增压只有在使用了几个内核时才会激活,但我不确定如何正确解释结果

要“关闭”涡轮增压,一种可能是修改流基准,如下所示:

  • 始终使用所有24个可用内核在整个基准测试过程中保持处理器负载大致恒定
  • 将基准的MPI通讯器
    MPI\u COMM\u WORLD
    拆分为两个独立的通讯器。一个通信器将与实际运行基准测试的N进程组相关联,另一个组包含剩余的24-N进程,其目的仅在于保持内核繁忙并防止涡轮增压
  • 24-N进程仅使用一级缓存中的数据,以最小化对其他进程的影响
  • 将基准测试的运行时间延长到几分钟(涡轮增压效果不会持续几秒钟?)
第一个实现仅将triad内核用于数据集上剩余的24-N进程,该数据集应适合一级缓存(32kByte)。基准测试的重复次数提高到5000次,数据数组长度的大小提高到1*10^7。调用函数
foo
以防止(成功地?)循环展开,在整个程序执行过程中,前面的if条件为
false
。相关代码如下:

  if (rank < N) {
    ...
    UNMODIFIED BENCHMARK
    ...
  } else {
    scalar=3.0;
    for (i=0; i<10000000000; i++) {
      for (j=0; j<1000; j++) a[j] = b[j]+scalar*c[j];
      if (a[2] < 1.0) foo(a,b,c);
    }   
  }
if(秩perf
perf stat
模式下执行此操作(或系统范围内的
perf stat-e cpu时钟、周期
perf stat-a-a
),当同时计算
周期
事件和一些墙时间事件(如
任务时钟
cpu时钟
时,它会按照
周期
打印平均cpu频率

我们可以通过读取墙时间(gettimeofday)和读取周期性能计数器(但不是RDTSC,因为大多数TSC现在是“不变TSC由CPUID.8000007H:EDX[8]”来在程序内部计算它).Mean_Frequency=cycles_consumed/consumed_time。我们可以在测试函数之前和之后,或在每个测试函数周围(如果启用了复制/缩放/添加流测试)执行此操作,以获得更详细的频率配置文件(有HPC跟踪项目,能够记录每次MPI调用的时间和周期)

cpu周期的内部读取(计算程序片段上的平均频率)可以通过一些PMU api来完成,如perf_事件(Linux,由
perf
使用)、libpfm3/libpfm4或HPC世界中使用的其他PMU访问库。一些PMU api可以在操作系统和cpu体系结构之间移植


或者,您可以尝试:禁用Boost(),或者使用非常凉水的水冷方式永久启用它(在拥有15+核心Xeon的世界中可能不起作用)。

Turbo Boost通常可以在BIOS中打开(在普通PC上)。我知道,但我在我们的集群上没有这种可能性。你好。你有什么解决方案吗?@Jakuje:不幸的是,我没有想出一个解决方案。el_tenedor,你可以在外部测量当前的cpu时钟(
perf stat
/
perf stat-e cpu时钟,周期
可以这样做)或在内部测量(读取壁时间和读取周期性能计数器)。cpu周期的内部读取(用于计算程序片段上的平均频率)可以使用一些PMU api(如perfmon、libpfm3/libpfm4、PAPI)完成。