Я написал и скомпилировал небольшую программу на С ++, и я мог запустить ее на ARM или ПК. Поскольку ARM и ПК имеют разные архитектуры набора команд, я хочу сравнить их. Можно ли получить количество выполненных инструкций в этой программе на С ++ для обоих ISA?
Что вам нужно, это профилировщик. перфорация будет один простой в использовании. Это даст вам количество инструкции, которые выполнены, это лучший показатель, если вы хотите сравнить эффективность ISA.
Проверьте учебник Вот.
Вам необходимо использовать: perf stat ./your binary
Ищите инструкции метрики. Этот подход использует регистр в блоке мониторинга производительности вашего CPU — PMU — который подсчитывает количество инструкций.
Вы пытаетесь получить количество статических инструкций или динамических инструкций? Так, например, если у вас есть следующий цикл (псевдокод):
for (i 0 to N):
a[i] = b[i] + c[i]
Статическое число команд будет чуть меньше 10 инструкций, отданных или полученных на основе вашего ISA, но динамический счет будет зависеть от N, от реализации прогнозирования ветвлений и так далее.
Так что для статического подсчета я бы рекомендовал использовать objdump согласно рекомендациям в комментариях. Вы можете найти метки входа и выхода вашей подпрограммы и посчитать количество инструкций между ними.
Для динамического подсчета команд я бы рекомендовал одну из двух вещей:
Надеюсь это поможет 🙂
objdump -dw mybinary | wc -l
В Linux и в друзьях это дает хорошее приближение к количеству инструкций в исполняемом файле, библиотеке или объектном файле. Это статический счет, который, конечно, совершенно отличается от поведения во время выполнения.
Linux:
valgrind --tool=callgrind ./program 1 > /dev/null