Я использую Linux Ubuntu и программирую на C ++. Мне удалось получить доступ к счетчикам производительности (счетчикам команд, отсутствию кэша и т. Д.) С помощью perf_event (фактически используя программы по этой ссылке: https://github.com/castl/easyperf).
Однако теперь я запускаю многопоточное приложение с использованием pthreads и нуждаюсь в подсчете команд и циклах до завершения каждого потока в отдельности. Есть идеи, как это сделать?
Спасибо!
perf — это инструмент для профилирования системы, который вы можете использовать. это не так https://github.com/castl/easyperf), которая является библиотекой, и вы используете ее в своем коде. Следуйте инструкциям и используйте его для профилирования вашей программы:
устанавливать perf
на Ubuntu. Установка может отличаться в разных дистрибутивах Linux. Вы можете ознакомиться с учебной линией по установке.
Просто запустите вашу программу и получите весь идентификатор вашей программы:
ps -eLf | grep [application name]
откройте отдельный терминал и запустите perf как perf stat -t [threadid]
согласно странице руководства:
usage: perf stat [<options>] [<command>]
-e, --event <event> event selector. use 'perf list' to list available events
-i, --no-inherit child tasks do not inherit counters
-p, --pid <n> stat events on existing process id
-t, --tid <n> stat events on existing thread id
-a, --all-cpus system-wide collection from all CPUs
-c, --scale scale/normalize counters
-v, --verbose be more verbose (show counter open errors, etc)
-r, --repeat <n> repeat command and print average + stddev (max: 100)
-n, --null null run - dont start any counters
-B, --big-num print large numbers with thousands' separators
есть аналитическая статья около perf
Вы можете почувствовать об этом.
Пожалуйста, посмотрите на perf
документация по инструменту Вот, он поддерживает некоторые события (например, оба instructions
а также cache-misses
), что вы ищете в профиль. Выдержка из вики-страницы, ссылки на которую приведены выше:
Инструмент perf может быть использован для подсчета событий для каждого потока, процесса, процессора или всей системы. В режиме для каждого потока счетчик контролирует только выполнение указанного потока. Когда поток запланирован вне, мониторинг останавливается. Когда поток мигрирует с одного процессора на другой, счетчики сохраняются на текущем процессоре и восстанавливаются на новом.
Вы можете использовать стандартный инструмент для доступа perf_event
— perf
(из linux-tools). Он может работать со всеми потоками вашей программы и сообщать сводный профиль и профиль для потока (per-pid / per-tid).
Этот профиль не является точным аппаратным счетчиком, а скорее результатом выборки каждые N событий, причем N настроен на частоту около 99 Гц (раз в секунду). Вы также можете попробовать -c 2000000
возможность получить образец каждые 2 миллиона аппаратного события. Например, цикл событий (полный список — perf list
или попробуйте некоторые из перечисленных в perf stat ./program
)
perf record -e cycles -F 99 ./program
perf record -e cycles -c 2000000 ./program
Резюме по всем темам. -n
покажет вам общее количество образцов
perf report -n
Per pid (на самом деле здесь используются приливы, так что это позволит вам выбрать любой поток).
В текстовом варианте будут перечислены все темы, записанные с итоговым отсчетом выборок (с -c 2000000
Вы можете умножить количество выборок на 2 миллиона, чтобы оценить количество событий hw для потока)
perf report -n -s pid | cat
Или ncurses-подобный интерактивный вариант, где вы можете выбрать любой поток и посмотреть его собственный профиль:
perf report -n -s pid