
В моем ПК два процессора, и я знаю, что каждый из них работает на частоте 1,86 ГГц.
Я хочу вручную измерить тактовый импульс процессора/ов моего ПК, и моя идея заключается в том, чтобы просто вычислить частное между количеством строк ассемблера в программе и временем, которое мой компьютер тратит на ее выполнение, чтобы получить количество ассемблерных инструкций за время, обрабатываемое процессором (это то, что, как я понял, является «тактовым циклом»). Я подумал сделать это следующим образом:
- Я пишу программу на языке C и преобразую ее в ассемблерный код.
- Я делаю:
$gcc -S my_program.c
, что говорит компилятору gcc выполнить весь процесс компиляции, за исключением последнего шага: преобразовать my_program.c в двоичный объект. Таким образом, у меня есть файл с именем my_program.s, который содержит исходный код моей программы на языке C, переведенный в ассемблерный код. Я подсчитал количество строк в моей программе (назовем это число N). Я это сделал:
$ nl -l my_program.s | tail -n 1
и получил следующее:1000015 .section .note.GNU-stack,"",@progbits
То есть программа содержит миллион строк кода.
- Я делаю:
$gcc my_program.c
чтобы я мог это выполнить. Я делаю:
$time ./a.out
(«a.out» — имя двоичного объекта my_program.c) для получения времени (назовем его T), затраченного на выполнение программы, и получаю:real 0m0.059s user 0m0.000s sys 0m0.004s
Предполагается, что время T, которое я ищу, является первым из представленных в списке: «реальным», поскольку остальные ссылаются на другие ресурсы, которые запущены в моей системе в тот же самый момент, когда я выполняю ./a.out
.
Итак, у меня есть N=1000015 строк и T=0,059 секунд. Если я выполню деление N/T, то получу частоту около 17 МГц, что, очевидно, не верно.
Затем я подумал, что, возможно, тот факт, что на моем компьютере работают другие программы, потребляющие аппаратные ресурсы (не вдаваясь в подробности, сама операционная система), заставляет процессор «разделять» свою «вычислительную мощность», и тактовый импульс становится медленнее, но я не уверен.
Но я подумал, что если это так, то я также должен найти процент ресурсов ЦП (или памяти), потребляемых моей программой, потому что тогда я мог бы действительно стремиться получить (хорошо) приближенный результат о моей реальной скорости ЦП.
И это приводит меня к вопросу о том, как узнать это «значение потребления ресурсов» моей программы. Я подумал о команде $ top
, но она сразу же отбрасывается из-за короткого времени, которое тратит моя программа на выполнение (0,059 секунды); невозможно различить простым взглядом какой-либо пик использования памяти за это короткое время.
Так что вы думаете об этом? Или что вы мне порекомендуете сделать? Я знаю, что есть программы, которые делают эту работу, которую я пытаюсь сделать, но я предпочитаю делать это с помощью сырого bash, потому что мне интересно сделать это наиболее "универсальным способом" из возможных (кажется, более надежным).
решение1
Это не сработает. Количество тактов, необходимых для выполнения каждой инструкции (их требуется довольно много, а не один), сильно зависит от точного набора инструкций, которые ее окружают, и варьируется в зависимости от конкретной модели процессора. У вас также есть прерывания, а ядро и другие задачи выполняют инструкции вперемешку с вашими. Вдобавок ко всему, частота динамически изменяется в ответ на нагрузку и температуру.
Современные процессоры имеют регистры, специфичные для модели, которые подсчитывают точное количество тактовых циклов. Вы можете прочитать это, и, используя таймер высокого разрешения, прочитать это снова через фиксированный период времени и сравнить два, чтобы узнать, какой была (средняя) частота за этот период.