Измерение тактовых частот процессора, потребляемых процессом - PullRequest
4 голосов
/ 07 апреля 2010

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

Ответы [ 5 ]

12 голосов
/ 07 апреля 2010

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

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

1 голос
/ 07 апреля 2010

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

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

1 голос
/ 07 апреля 2010

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

1 голос
/ 07 апреля 2010

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

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

0 голосов
/ 07 апреля 2010

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

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

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

...