Как подсчитать инструкции, выполненные в Red Hat Enterprise Linux (x86-64)? - PullRequest
6 голосов
/ 17 ноября 2010

Я хочу узнать, сколько инструкций x86-64 выполняется во время данного запуска программы, работающей в Red Hat Enterprise Linux.Я знаю, что могу получить эту информацию от valgrind , но замедление значительно.Я также знаю, что мы используем процессоры Intel Core 2 Quad (модель Q6700), в которые встроены аппаратные счетчики производительности. Но я не знаю ни одного способа получить доступ к общему количеству инструкций, выполненных из программы на Си.1003 *

Ответы [ 4 ]

2 голосов
/ 17 ноября 2010

Интерфейс прикладного программирования для повышения производительности (PAPI) похоже на то, что вы ищете.

С сайта :

PAPI стремится предоставить разработчику инструментов и инженеру приложений согласованный интерфейс и методологию для использования аппаратного счетчика производительности, имеющегося в большинстве основных микропроцессоров.

Винс Уивер, научный сотрудник, работающий в докторантуре в Инновационной вычислительной лаборатории в Университете Теннесси, выполнил работу, связанную с PAPI 1015 *. Исследование, указанное на его веб-странице в ЮТК, похоже, может дать некоторую дополнительную информацию.

2 голосов
/ 17 ноября 2010

libpapi - это библиотека, которую вы ищете. Чипы AMD и Intel обеспечивают подсчет insn.

1 голос
/ 17 ноября 2010

Программа ниже доступа к регистру счетчика циклов из C (извините, не переносимый код, но работает нормально с gcc).Этот для подсчета циклов, это не то же самое, что инструкции.Современные процессоры могут использовать несколько циклов для одной и той же инструкции или выполнять несколько инструкций одновременно.Cycles обычно больше интересует это количество инструкций, но это зависит от вашей реальной цели.

Другие счетчики производительности, безусловно, могут быть доступны тем же способом (на самом деле я даже не знаю, есть ли другие), но мне придется искать действительный код инструкции для использования.

static __inline__ unsigned long long rdtsc(void)
{
   unsigned long long int x;
   __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
   return x;

}

1 голос
/ 17 ноября 2010

Есть несколько способов сделать это, в зависимости от того, что именно вам нужно.Если вы просто хотите узнать общее количество потенциальных аргументов, вы можете просто запустить objdump в двоичном файле, который даст вам сборку.Если вы хотите получить более подробную информацию о реальных инструкциях, выполняемых при данном прогоне программы, вы можете обратиться к DynamoRIO , который обеспечивает эту функциональность.Это похоже на valgrind, но я считаю, что оно оказывает меньшее влияние на производительность.В сентябре я смог сравнительно быстро и легко собрать базовый счетчик команд с ним.

Если это нехорошо, вы можете попробовать PAPI , который представляет собой API, который должен позволить вам получить доступ к счетчикам производительности на ваших процессорах.Я никогда не использовал его, поэтому я не могу говорить за это, но мой друг использовал его в проекте около 6 месяцев назад и сказал, что он нашел его очень полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...