Как посчитать количество тактов ЦП между началом и концом теста в gem5?

Как посчитать количество тактов ЦП между началом и концом теста в gem5?

Я заинтересован во всех следующих случаях:

  • эталонный тест для всей системы. Может быть m5 У гостевого инструмента есть способ сделать это?

  • голый металлический тест. Когда gem5 выходит из системы, он автоматически выводит статистику, поэтому главный вопрос заключается в том, как пропустить циклы для загрузчика и перейти непосредственно к самому тесту.

    Есть ли способ помимо изменения исходного кода с помощью инструментария инструментария? Как написать эти инструкции по приборам в деталях?

  • тест эмуляции syscall. Я думаю, что gem5 просто выводит stats.txt в конце пробега, а затем вы можете просто grep system.cpu.numCycles, но я должен подтвердить это, в настоящее время заблокирован на: Как решить "FATAL: ядро ​​слишком старое" при запуске gem5 в режиме SE эмуляции syscall?

Я хочу использовать это, чтобы узнать:

  • узнать, как работают процессоры
  • как оптимизировать код сборки или настройки компилятора для оптимальной работы на данном процессоре

1 ответ

m5инструмент

Хорошим приближением является запуск, в идеале из сценария оболочки, который является /init программа:

m5 resetstats
run-benchmark
m5 dumpstats

Тогда на хосте:

grep -E '^system.cpu.numCycles ' m5out/stats.txt

Дает что-то вроде:

system.cpu.numCycles                      33942872680                       # number of cpu cycles simulated

Обратите внимание, что если вы воспроизводите с m5 checkpoint с другим процессором, например:

--restore-with-cpu=HPI --caches

тогда вам нужно grep для другого идентификатора:

grep -E '^system.switch_cpus.numCycles ' m5out/stats.txt

resetstats обнуляет совокупную статистику и dumpstats сбрасывает то, что было собрано во время теста.

Это не идеально, так как между системным вызовом exec есть некоторое время для m5 dumpstats окончание и начало теста, но если тест достаточно, это не должно иметь значения.

http://arm.ecs.soton.ac.uk/wp-content/uploads/2016/10/gem5_tutorial.pdf также предлагает еще несколько эвристик:

#!/bin/sh
# Wait for system to calm down
sleep 10
# Take a checkpoint in 100000 ns
m5 checkpoint 100000
# Reset the stats
m5 resetstats
run-benchmark
# Exit the simulation
m5 exit

m5 exit также работает, так как GEM5 сбрасывает статистику по окончании.

Инструкции по эксплуатации

Иногда кажется, что это просто неизбежно, что вам нужно немного изменить исходный код с помощью этих инструкций, чтобы:

  • пропустить инициализацию и перейти непосредственно в устойчивое состояние
  • оценивать отдельные прогоны основного цикла

Пример можно найти по адресу: https://github.com/arm-university/arm-gem5-rsk/blob/aa3b51b175a0f3b6e75c9c856092ae0c8f2a7cdc/parsec_patches/xcompile-patch.diff#L188 в контексте теста Parsec.

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

Адресный мониторинг

Другой способ, который можно использовать, - отслеживать интересующие адреса вместо добавления магических инструкций к источнику.

Например, если вы знаете, что тест начинается с PIC == 0x400, должно быть возможно сделать что-то, когда этот адрес ударил.

Чтобы найти интересующие адреса, вы должны, например, использовать readelf или же gdb или трассировку, и если полная система работает поверх Linux, убедитесь, что ASLR выключен.

Этот метод был бы наименее навязчивым, но установка сложнее, и, честно говоря, я еще не сделал этого. Один день, один день.

Другие вопросы по тегам