Измерение тактовых частот процессора, потребляемых процессом
Я написал программу на C. Это программа, созданная в результате исследования. Я хочу вычислить точные циклы процессора, которые потребляет программа. Точное количество циклов. Любая идея, как я могу найти это?
5 ответов
valgrind
инструмент cachegrind
(valgrind --tool=cachegrind
) даст вам подробный вывод, включая количество выполненных инструкций, пропуски кеша и пропуски ветвления. Они могут быть отнесены к отдельным линиям ассемблера, поэтому в принципе (со знанием вашей точной архитектуры) вы можете получить точное число циклов из этого вывода.
Знайте, что это изменится от выполнения к выполнению, из-за эффектов кэша.
Документация для инструмента cachegrind находится здесь.
Я не совсем уверен, что точно знаю, что вы пытаетесь сделать, но что можно сделать на современных процессорах x86, это прочитать счетчик меток времени (TSC) до и после интересующего вас блока кода. уровень сборки, это делается с помощью RDTSC
инструкция, которая дает вам значение TSC в edx:eax
зарегистрировать пару.
Однако обратите внимание, что у этого подхода есть определенные предостережения, например, если ваш процесс начинается на CPU0 и заканчивается на CPU1, результат, который вы получаете от RDTSC
будет ссылаться на конкретное ядро процессора, которое выполнило инструкцию, и, следовательно, может быть несопоставимым. (Существует также отсутствие сериализации инструкций с RDTSC
, но в этом контексте я не думаю, что это большая проблема.)
Попробуйте OProfile. Он использует различные аппаратные счетчики на процессоре для измерения количества выполненных инструкций и количества пройденных циклов. Вы можете увидеть пример его использования в статье, Часть 7 памяти: Инструменты производительности памяти.
Нет, ты не можешь. Понятие "цикл ЦП" недостаточно четко определено. Современные чипы могут работать с разной тактовой частотой, и разные их части могут делать разные вещи в разное время.
Вопрос о том, "сколько всего шагов конвейера" может в некоторых случаях иметь смысл, но вряд ли найдется способ его получить.
Извините, но нет, по крайней мере, не для большинства практических целей - это просто невозможно с большинством обычных ОС. Например, многие операционные системы не выполняют полное переключение контекста для обработки прерывания, поэтому время, затрачиваемое на обслуживание прерывания, может и часто будет казаться временем, потраченным в любом процессе, выполнявшемся, когда произошло прерывание.
"Не для практических целей" будет указывать на возможность запуска вашей программы в симуляторе с точным циклом. Они доступны, но в основном для процессоров, используемых в основном во встроенных системах реального времени, а НЕ для чего-либо похожего на полноценный ПК. Хуже того, они (как правило) предназначены не для запуска чего-либо похожего на полноценную ОС, а для кода, работающего на "голом железе".
Теоретически, вы могли бы что-то сделать с виртуальной машиной, работающей под чем-то вроде Windows или Linux - но я не знаю ни одной существующей виртуальной машины, которая пытается это сделать, и это было бы решительно нетривиальным и, вероятно, довольно серьезным последствия в производительности (мягко говоря).