Я хотел бы статистически представить свой код C на уровне инструкции. Я должен знать, сколько дополнений, умножения, подразделений, и т.д. я выполняю.
Это не Ваше обычное выполнение кода фрезы профильное требование. Я - разработчик алгоритма, и я хочу оценить стоимость преобразования моего кода к аппаратным реализациям. Для этого меня спрашивают разбивку вызова инструкции во время времени выполнения (парсинг скомпилированного блока не достаточен, поскольку это не рассматривает циклы в коде).
После оглядывания кажется, что VMware может предложить возможное решение, но я все еще не мог найти определенную функцию, которая позволит мне прослеживать поток вызова инструкции своего процесса.
Вы знаете о каких-либо профильных инструментах, которые включают это?
В конце концов я использовал тривиальное, но эффективное решение.
display / i $ pc
Настроил простой скрипт gdb, который прерывает функцию, которую я должен анализировать, и переходит к пошаговой инструкции за инструкцией:
установить $ i = 0
сломать главный
запустить
в то время как ($ i <100000)
си
установить $ i = $ i + 1
конец
покидать
Выполнял gdb с выводом моего сценария в файл журнала:
gdb -x script a.out> log.txt
Проанализировал журнал для подсчета вызовов конкретных инструкций.
Грубо, но работает ...
Инструмент valgrind cachegrind можно использовать для получения количества выполнения каждой строки в скомпилированной сборке (значение Ir
в первой колонке).