Есть ли способ профилировать программу MPI с подробной информацией об эффективности кэша / процессора?

ОС: Ubuntu 18.04 Вопрос: Как профилировать многопроцессорную программу?

Обычно я использую инструмент GNU perf для профилирования программы следующим образом: perf stat -d ./main [args], и эта команда вернет подробный счетчик производительности следующим образом:

               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

Я сосредотачиваюсь на эффективности ЦП (строка 1), IPC (строка 6), L1 и пропускной способности LLC (строки 9 и 11).

Но теперь мне нужно профилировать каждый процесс программы MPI, предположим, что у нас есть 3 процесса, выполнив mpiexec -np 3 ./main [args], как я могу получить информацию об эффективности ЦП, 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++?)

1 ответ

Базовые профилировщики, такие как gperf или gprof, плохо работают с программами MPI, но существует множество инструментов профилирования, специально разработанных для работы с MPI, которые собирают и предоставляют данные для каждого ранга MPI. Практически все они могут собирать аппаратные счетчики производительности для промахов кеша. Вот несколько вариантов:

  • HPCToolkit для профилирования на основе выборки. Работает с немодифицированными двоичными файлами.
  • TAU и Score-P обеспечивают инструментальное профилирование. Обычно требует перекомпиляции.
  • TiMemory и суппорт позволяют помечать код регионы меры. В TiMemory также есть скрипты для анализа кровли и т. Д.

В приличных центрах высокопроизводительных вычислений обычно установлено один или несколько из них. Обратитесь к руководствам, чтобы узнать, как собирать аппаратные счетчики.

Другие вопросы по тегам