首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Intel Turbo Boost修改多核处理器的流基准(MPI)?

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

Stack Overflow用户
提问于 2015-02-17 14:56:49
回答 1查看 846关注 0票数 2

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

在下面的文章中,我将使用openmpi v. 1.8.2和选项map-by core,以M字节/s格式给出三位一体测试的结果。源是使用包装器编译的。

代码语言:javascript
复制
icc (ICC) 15.0.0 20140723

使用编译器选项

代码语言:javascript
复制
-O3 -xHost.

每个核都使用了长度为2*10^6的双精度数组,测试重复了50次:

代码语言:javascript
复制
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进程测量的可持续带宽的停滞。我认为,使用的处理器的涡轮增压可能是偏颇的结果。显然,Turbo Boost只在几个核心被使用时才会激活,但我不知道如何正确地解释结果。

要“关闭”Turbo Boost,一种可能是修改流基准,如下所示:

  • 始终使用所有24个可用核心来维护整个基准测试期间的处理器负载大致恒定。
  • 将基准测试的MPI通信器MPI_COMM_WORLD拆分为两个单独的。一个通信器将与实际运行基准测试的N进程组相关联,另一个通信程序将包含剩余的24-N进程,这些进程的目的只是为了保持内核的忙碌和防止涡轮增压。
  • 24-N进程只使用l1缓存中的数据来最小化对其他进程的影响。
  • 将基准测试运行的时间延长到几分钟(Turbo Boost效果不会持续几秒钟?)

第一个实现只对数据集中的剩余24-N进程使用三合会内核,该数据集应该适合L1-缓存(32 32kByte)。基准测试的重复次数提高到5000次,数据数组长度的大小提高到1*10^7。调用函数foo是为了防止(成功地?)循环展开,在整个程序执行过程中,前面的if条件是false。相关代码显示

代码语言:javascript
复制
  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);
    }   
  }

在main之外,a、b和c被声明为static double a[LEN],b[LEN],c[LEN]。我还阅读了关于静态修饰符及其对基准测试的影响的讨论。我不确定是否真的有必要打电话给foo

不幸的是,我的方法并没有导致与基准测试不同的结果。

我的方法有什么问题?你知道替代方案吗?或者你对我应该如何修改基准有建议吗?

编辑:

由于有一个用户对我用于基准测试的代码表示了兴趣:

我使用了随PETSc一起提供的流基准测试的修改版本:

http://www.mcs.anl.gov/petsc/

一旦在系统上安装了PETSc,就会在src/benchmarks/streams中找到基准测试。

如果您只对源代码感兴趣,您将在他们的GitHub页面上找到最新版本:

https://github.com/petsc/petsc/tree/master/src/benchmarks/streams

EN

回答 1

Stack Overflow用户

发布于 2016-06-26 01:54:13

您可以使用一些分析工具从外部测量当前的cpu时钟,该工具可以访问硬件性能监视单元,以获得用于程序的cpu周期的真实计数。例如,linux perfperf stat模式(或系统范围内的perf stat -e cpu-clock,cyclesperf stat -a -A )中这样做,当有cycles事件计数和一些像task-clockcpu-clock这样的墙时间事件时,它会输出与cycles一致的平均CPU频率。

我们可以通过读取墙壁时间(gettimeofday)和读取周期性能计数器(但不包括RDTSC,因为大多数TSC现在都是不变量 )来计算这一点,“不变TSC由CPUID.80000007H:EDX8 8表示”)。Mean_Frequency = cycles_consumed / spent_time.我们可以在测试函数之前和之后,或者在每个测试函数(如果启用了复制/缩放/添加流测试)前后进行,以获得更详细的频率配置文件(有HPC跟踪项目,能够记录每个MPI调用的时间和周期)。

cpu周期的内部读取(计算程序片段上的平均频率)可以使用一些PMU完成,比如perf_events (Linux,这是由perf使用的)、perfmon、libpfm3/libpfm4 4、帕皮或其他在高性能HPC世界中使用的PMU访问库。一些PMU在OSes和CPU架构之间是可移植的。

或者,您可以尝试:禁用Boost (https://stackoverflow.com/a/38034503/196561)或永久启用它,使用带有非常冷的水的水冷却(在使用15+核心Xeons的世界中可能无法工作)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28564292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档