Как я могу получить количество инструкций, выполненных программой?

Я написал и скомпилировал небольшую программу на С ++, и я мог запустить ее на ARM или ПК. Поскольку ARM и ПК имеют разные архитектуры набора команд, я хочу сравнить их. Можно ли получить количество выполненных инструкций в этой программе на С ++ для обоих ISA?

4

Решение

Что вам нужно, это профилировщик. перфорация будет один простой в использовании. Это даст вам количество инструкции, которые выполнены, это лучший показатель, если вы хотите сравнить эффективность ISA.

Проверьте учебник Вот.

Вам необходимо использовать: perf stat ./your binary

Ищите инструкции метрики. Этот подход использует регистр в блоке мониторинга производительности вашего CPU — PMU — который подсчитывает количество инструкций.

4

Другие решения

Вы пытаетесь получить количество статических инструкций или динамических инструкций? Так, например, если у вас есть следующий цикл (псевдокод):

for (i 0 to N):
a[i] = b[i] + c[i]

Статическое число команд будет чуть меньше 10 инструкций, отданных или полученных на основе вашего ISA, но динамический счет будет зависеть от N, от реализации прогнозирования ветвлений и так далее.

Так что для статического подсчета я бы рекомендовал использовать objdump согласно рекомендациям в комментариях. Вы можете найти метки входа и выхода вашей подпрограммы и посчитать количество инструкций между ними.

Для динамического подсчета команд я бы рекомендовал одну из двух вещей:

  • Вы можете смоделировать выполнение этого кода с помощью симулятора набора команд (существуют симуляторы ISA с открытым исходным кодом для ARM и x86 — например, Gem5 реализует их оба, есть другие, которые поддерживают один или другой.
  • Второй вариант — запустить его в целевой системе и настроить счетчики производительности в ЦП, чтобы сообщать о динамическом количестве команд. Вы должны выполнить сброс перед выполнением кода и прочитать его впоследствии (здесь может быть некоторый шум, связанный с вызовом подпрограммы и выходом из нее, но вы должны быть в состоянии изолировать это)

Надеюсь это поможет 🙂

4

objdump -dw mybinary | wc -l

В Linux и в друзьях это дает хорошее приближение к количеству инструкций в исполняемом файле, библиотеке или объектном файле. Это статический счет, который, конечно, совершенно отличается от поведения во время выполнения.

1

Linux:
valgrind --tool=callgrind ./program 1 > /dev/null

0
По вопросам рекламы [email protected]