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

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


person hasanatkazmi    schedule 06.04.2010    source источник
comment
Точный. Как насчет процессоров, которые оптимизируют потоки инструкций и могут перекрывать инструкции? Что это значит? software.intel.com/en -нас/статьи/   -  person S.Lott    schedule 07.04.2010


Ответы (5)


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

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

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

person caf    schedule 06.04.2010

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

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

person bmargulies    schedule 06.04.2010

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

person Robert S. Barnes    schedule 06.04.2010

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

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

person PhiS    schedule 07.04.2010

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

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

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

person Jerry Coffin    schedule 06.04.2010