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