Измерение тактовых частот процессора, потребляемых процессом

Я написал программу на C. Это программа, созданная в результате исследования. Я хочу вычислить точные циклы процессора, которые потребляет программа. Точное количество циклов. Любая идея, как я могу найти это?

5 ответов

valgrind инструмент cachegrind (valgrind --tool=cachegrind) даст вам подробный вывод, включая количество выполненных инструкций, пропуски кеша и пропуски ветвления. Они могут быть отнесены к отдельным линиям ассемблера, поэтому в принципе (со знанием вашей точной архитектуры) вы можете получить точное число циклов из этого вывода.

Знайте, что это изменится от выполнения к выполнению, из-за эффектов кэша.

Документация для инструмента cachegrind находится здесь.

Я не совсем уверен, что точно знаю, что вы пытаетесь сделать, но что можно сделать на современных процессорах x86, это прочитать счетчик меток времени (TSC) до и после интересующего вас блока кода. уровень сборки, это делается с помощью RDTSC инструкция, которая дает вам значение TSC в edx:eax зарегистрировать пару.

Однако обратите внимание, что у этого подхода есть определенные предостережения, например, если ваш процесс начинается на CPU0 и заканчивается на CPU1, результат, который вы получаете от RDTSC будет ссылаться на конкретное ядро ​​процессора, которое выполнило инструкцию, и, следовательно, может быть несопоставимым. (Существует также отсутствие сериализации инструкций с RDTSC, но в этом контексте я не думаю, что это большая проблема.)

Попробуйте OProfile. Он использует различные аппаратные счетчики на процессоре для измерения количества выполненных инструкций и количества пройденных циклов. Вы можете увидеть пример его использования в статье, Часть 7 памяти: Инструменты производительности памяти.

Нет, ты не можешь. Понятие "цикл ЦП" недостаточно четко определено. Современные чипы могут работать с разной тактовой частотой, и разные их части могут делать разные вещи в разное время.

Вопрос о том, "сколько всего шагов конвейера" может в некоторых случаях иметь смысл, но вряд ли найдется способ его получить.

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

"Не для практических целей" будет указывать на возможность запуска вашей программы в симуляторе с точным циклом. Они доступны, но в основном для процессоров, используемых в основном во встроенных системах реального времени, а НЕ для чего-либо похожего на полноценный ПК. Хуже того, они (как правило) предназначены не для запуска чего-либо похожего на полноценную ОС, а для кода, работающего на "голом железе".

Теоретически, вы могли бы что-то сделать с виртуальной машиной, работающей под чем-то вроде Windows или Linux - но я не знаю ни одной существующей виртуальной машины, которая пытается это сделать, и это было бы решительно нетривиальным и, вероятно, довольно серьезным последствия в производительности (мягко говоря).

Другие вопросы по тегам