Инструкции по профилированию

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


person Atilla Filiz    schedule 12.07.2009    source источник


Ответы (6)


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

person Hasturkun    schedule 12.07.2009
comment
Не считает инструкции напрямую, но помогает просматривать сборку очень удобным способом. Спасибо. - person Atilla Filiz; 14.07.2009

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

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

person Ariel    schedule 12.07.2009
comment
+1 А доступ к памяти (попадания/промахи кеша) может сыграть большую роль в определении реальной производительности, а количество операций об этом ничего не скажет. - person sharptooth; 13.07.2009

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

person CB Bailey    schedule 12.07.2009
comment
Это дало бы вам статический подсчет, считая каждую инструкцию один раз, независимо от того, находится ли она в цикле или в else, который никогда не выполнялся. Вопрос хочет знать, сколько на самом деле выполнено; динамический счет. - person Peter Cordes; 03.12.2020

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

person Goz    schedule 12.07.2009
comment
Как и компилятор, Vtune предоставляется бесплатно только в течение 30 дней в качестве пробной версии. Он указан как 699 долларов. Довольно далеко от бесплатного. - person greyfade; 12.07.2009
comment
моя ошибка, я уверен, что это ИСПОЛЬЗОВАЛОСЬ, чтобы быть бесплатным для пользователей Linux .. или, может быть, я просто схожу с ума .... - person Goz; 13.07.2009

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

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

person Wu Yongzheng    schedule 18.05.2014

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

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

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

person Jeremy Friesner    schedule 12.07.2009
comment
Действительно, переменных больше, чем когда-либо, и точный прогноз сделать сложно. И есть много факторов, которые, вероятно, более важны, чем количество инструкций. Тем не менее, некоторые отношения были верными и останутся верными в обозримом будущем, например, стоимость (сложение) ‹ = стоимость (умножение) ‹ = стоимость (деление) ‹ = стоимость (квадратный корень). Замена деления на умножение вряд ли повлияет на производительность и может помочь. - person George Phillips; 12.07.2009
comment
Вы правы с точки зрения производительности. Однако моя цель состоит не в том, чтобы оптимизировать мой код для повышения производительности, а в том, чтобы выполнять другие типы анализа (типы инструкций и частоту). - person Atilla Filiz; 14.07.2009