Трассировка/профилирование инструкций

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

Это не Ваше обычное выполнение кода фрезы профильное требование. Я - разработчик алгоритма, и я хочу оценить стоимость преобразования моего кода к аппаратным реализациям. Для этого меня спрашивают разбивку вызова инструкции во время времени выполнения (парсинг скомпилированного блока не достаточен, поскольку это не рассматривает циклы в коде).

После оглядывания кажется, что VMware может предложить возможное решение, но я все еще не мог найти определенную функцию, которая позволит мне прослеживать поток вызова инструкции своего процесса.

Вы знаете о каких-либо профильных инструментах, которые включают это?

13
задан Pascal Cuoq 4 June 2010 в 08:42
поделиться

2 ответа

В конце концов я использовал тривиальное, но эффективное решение.

  1. Настроен GDB для отображения дизассемблирования следующей инструкции (каждый раз, когда она останавливается), вызывая:

display / i $ pc

  1. Настроил простой скрипт gdb, который прерывает функцию, которую я должен анализировать, и переходит к пошаговой инструкции за инструкцией:

     установить $ i = 0
    сломать главный
    запустить
    в то время как ($ i <100000)
    си
    установить $ i = $ i + 1
    конец
    покидать
    

  2. Выполнял gdb с выводом моего сценария в файл журнала:

    gdb -x script a.out> log.txt

  3. Проанализировал журнал для подсчета вызовов конкретных инструкций.

Грубо, но работает ...

10
ответ дан 1 December 2019 в 21:37
поделиться

Инструмент valgrind cachegrind можно использовать для получения количества выполнения каждой строки в скомпилированной сборке (значение Ir в первой колонке).

4
ответ дан 1 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: