有没有一种方法可以使用详细的 cache/CPU 效率信息来分析 MPI 程序?
Is there a way to profile a MPI program with detailed cache/CPU efficiency information?
OS: Ubuntu 18.04
问题:如何分析多进程程序?
我通常使用 GNU perf 工具来分析一个程序,如下所示:
perf stat -d ./main [args]
,此命令将 return 详细的性能计数器如下:
47,455.09 msec task-clock # 8.602 CPUs utilized
129,199 context-switches # 0.003 M/sec
92 cpu-migrations # 0.002 K/sec
16,228 page-faults # 0.342 K/sec
117,757,409,457 cycles # 2.481 GHz (49.84%)
236,496,093,412 instructions # 2.01 insn per cycle (62.31%)
1,454,901,353 branches # 30.658 M/sec (62.18%)
6,168,091 branch-misses # 0.42% of all branches (62.30%)
183,462,410,176 L1-dcache-loads # 3866.021 M/sec (62.55%)
189,736,991 L1-dcache-load-misses # 0.10% of all L1-dcache hits (62.75%)
8,330,520 LLC-loads # 0.176 M/sec (50.14%)
628,142 LLC-load-misses # 7.54% of all LL-cache hits (50.25%)
5.516529249 seconds time elapsed
46.947476000 seconds user
0.989185000 seconds sys
我关注的是 CPU 效率(第 1 行)、IPC(第 6 行)、L1 和 LLC 带宽(第 9 和 11 行)。
但是现在,我需要分析一个 MPI 程序的每个进程,假设我们有 3 个进程通过执行 mpiexec -np 3 ./main [args]
,我怎样才能获得 CPU 效率,每个进程的IPC、L1、LLC信息分别是?(使用perf stat -d,我只得到3个进程的整体信息,目前对我来说还不够)
我想要的输出是这样的:
PID: 1
LLC Band.: xxx
PID: 2
LLC Band.: xxx
PID: 3
LLC Band.: xxx
我该怎么做? (我想知道 GNU gperf
可以做到这一点吗?或者有一些 C++ 方法可以做到这一点吗?)
像 gperf 或 gprof 这样的基本分析器不能很好地与 MPI 程序一起工作,但是有许多专门设计用于 MPI 的分析工具可以收集和报告每个 MPI 等级的数据。几乎所有这些都可以收集缓存未命中的硬件性能计数器。这里有几个选项:
- HPCToolkit 用于基于抽样的分析。适用于未修改的二进制文件。
- TAU and Score-P 提供基于检测的分析。通常需要重新编译。
- TiMemory and Caliper 让您标记要测量的代码区域。 TiMemory还有roofline分析等脚本
体面的 HPC 中心通常安装了一个或多个。请参阅手册以了解如何收集硬件计数器。
OS: Ubuntu 18.04 问题:如何分析多进程程序?
我通常使用 GNU perf 工具来分析一个程序,如下所示:
perf stat -d ./main [args]
,此命令将 return 详细的性能计数器如下:
47,455.09 msec task-clock # 8.602 CPUs utilized
129,199 context-switches # 0.003 M/sec
92 cpu-migrations # 0.002 K/sec
16,228 page-faults # 0.342 K/sec
117,757,409,457 cycles # 2.481 GHz (49.84%)
236,496,093,412 instructions # 2.01 insn per cycle (62.31%)
1,454,901,353 branches # 30.658 M/sec (62.18%)
6,168,091 branch-misses # 0.42% of all branches (62.30%)
183,462,410,176 L1-dcache-loads # 3866.021 M/sec (62.55%)
189,736,991 L1-dcache-load-misses # 0.10% of all L1-dcache hits (62.75%)
8,330,520 LLC-loads # 0.176 M/sec (50.14%)
628,142 LLC-load-misses # 7.54% of all LL-cache hits (50.25%)
5.516529249 seconds time elapsed
46.947476000 seconds user
0.989185000 seconds sys
我关注的是 CPU 效率(第 1 行)、IPC(第 6 行)、L1 和 LLC 带宽(第 9 和 11 行)。
但是现在,我需要分析一个 MPI 程序的每个进程,假设我们有 3 个进程通过执行 mpiexec -np 3 ./main [args]
,我怎样才能获得 CPU 效率,每个进程的IPC、L1、LLC信息分别是?(使用perf stat -d,我只得到3个进程的整体信息,目前对我来说还不够)
我想要的输出是这样的:
PID: 1
LLC Band.: xxx
PID: 2
LLC Band.: xxx
PID: 3
LLC Band.: xxx
我该怎么做? (我想知道 GNU gperf
可以做到这一点吗?或者有一些 C++ 方法可以做到这一点吗?)
像 gperf 或 gprof 这样的基本分析器不能很好地与 MPI 程序一起工作,但是有许多专门设计用于 MPI 的分析工具可以收集和报告每个 MPI 等级的数据。几乎所有这些都可以收集缓存未命中的硬件性能计数器。这里有几个选项:
- HPCToolkit 用于基于抽样的分析。适用于未修改的二进制文件。
- TAU and Score-P 提供基于检测的分析。通常需要重新编译。
- TiMemory and Caliper 让您标记要测量的代码区域。 TiMemory还有roofline分析等脚本
体面的 HPC 中心通常安装了一个或多个。请参阅手册以了解如何收集硬件计数器。