2015-06-26 2 views
2

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

+1

Обычно вы можете дизассемблировать ('objdump' с помощью инструментов GNU binutils) или использовать такую ​​программу, как [' size'] (https://en.wikipedia.org/wiki/Size_%28Unix%29). Ответы зависят от компилятора, версии компилятора, аргументов командной строки, формата вывода и т. Д. –

+0

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

+1

Вы имеете в виду a) размер программы в инструкции, или b) количество инструкций, выполняемых при запуске программы? Например, небольшая петля может иметь небольшой (a) и большой (b). –

ответ

4

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

Проверьте учебное пособие here.

Вы должны использовать: perf stat ./your binary

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

3

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

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

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

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

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

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

Надеется, что это помогает :)

1
objdump -dw mybinary | wc -l 

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

+0

Эта команда на основе objdump просто распечатывает количество строк разборки, которое дает приблизительные инструкции в двоичных, а не выполненных инструкциях (он не включает в себя циклы, ветви, ...) – Zskdan

Смежные вопросы