Вы можете использовать стандартный инструмент для доступа к 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
Эти профиляторы в другом вопросе не используют C++. Это инструменты, такие как Valgrind, которые имеют существенные накладные расходы. – masab
Вы можете попробовать изменить флаг наследования в easyperf (http://stackoverflow.com/a/28871708 и man perf_event_open) и запустить его в каждом pthread в начале потока. – osgx