Инструкции по профилированию - PullRequest
2 голосов
/ 12 июля 2009

Я хочу посчитать несколько инструкций процессора в моем коде. например Я хотел бы знать, сколько сложений, сколько умножений, сколько операций с плавающей запятой, сколько ветвей выполняет мой код. В настоящее время я использую gprof под Linux для профилирования своего кода на C ++, но он дает только количество вызовов моих функций, и я вручную оцениваю количество инструкций. Есть ли инструменты, которые могут помочь мне? Может быть, какая-то виртуальная машина?

Ответы [ 6 ]

5 голосов
/ 12 июля 2009

Если вам действительно нужно посчитать инструкции, то вам лучше всего сгенерировать ассемблер и затем передать результат в интеллектуальный эквивалент grep. Для gcc попробуйте переключатель -S.

4 голосов
/ 12 июля 2009

Это общий совет, не относящийся к Linux: вас должны интересовать циклы процессора. Забудьте о количестве инструкций в качестве показателя производительности. Одна инструкция может стоить столько же, сколько и другие 10 вместе, поэтому она ничего вам не скажет.

Вы должны сосредоточиться на циклах ЦП и в многопоточных средах (большинство, если не все сегодня) во время перевода потока в спящий режим («выключен / выключен»), что даст вам представление о том, сколько времени ожидает для ввода-вывода, БД и т. д., что влияет на привилегированное время ЦП.

2 голосов
/ 12 июля 2009

Вы можете использовать Valgrind * Callgrind с флагом --dump-instr=yes для достижения этого

1 голос
/ 12 июля 2009

Intel Intel vtune бесплатна для пользователей Linux, AFAIK (при условии, что речь идет о машине x86 на базе Linux). Это даст вам всю необходимую информацию, а СООО гораздо больше.

0 голосов
/ 18 мая 2014

Вы можете использовать pin-instat , который является PIN инструментом. Чтобы использовать его, вам нужно установить PIN-код. Тем не менее, количество команд само по себе не говорит о производительности. Отсутствие кэша, предсказание ветвлений также играют большую роль.

Отказ от ответственности: я автор pin-instat.

0 голосов
/ 12 июля 2009

Просто из любопытства, полезен ли счетчик команд для оценки производительности кода?

Я знаю, что во времена "простых" конструкций ЦП можно было разумно предположить, что каждый код операции будет занимать ровно столько наносекунд процессорного времени, но в наши дни со всеми сложными схемами кэширования памяти, на - Переупорядочение кода операции «на лету», конвейерная обработка, суперскалярная архитектура и все остальное, что было добавлено в современный ЦП, дает ли простой подсчет выполнения кода операции хороший показатель того, сколько времени займет выполнение кода? Или время исполнения будет изменяться в зависимости от (например) шаблонов доступа к памяти и последовательности выполнения кодов операций, как это будет происходить на исходной частоте выполнения кодов операций?

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

...