Как посчитать, сколько раз использовалась глобальная переменная (чтение и запись)? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь оптимизировать проект кода C.

Я хотел бы подсчитать, сколько раз использовалась глобальная переменная (чтение или запись), чтобы разместить ее в наиболее подходящем типе памяти.
Например, для хранения часто используемых переменных в типе памяти быстрого доступа.

Кэш данных отключен по причинам детерминированности.

Есть ли способ подсчитать, сколько раз переменная былаиспользуется без вставки счетчиков или добавления дополнительного кода?например, используя код ассемблера?

Код написан на языке C.

В моем распоряжении:

A) (.map) файл, сгенерированный компилятором GCC.из которого я извлекаю имена, адреса и размеры глобальных переменных.

B) Код сборки проекта, сгенерированный с помощью флага -S компилятора GCC.

Большое спасибо,

Ответы [ 3 ]

0 голосов
/ 21 июня 2019

GDB имеет то, что называется watchpoints : https://sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html

Установите точку наблюдения для выражения.GDB сломается, когда выражение expr записано программой и его значение изменится.Самое простое (и самое популярное) использование этой команды - просмотреть значение одной переменной:

(gdb) watch foo

awatch [-l | -location] expr [threadthread-id] [mask maskvalue]

Установить точку наблюдения, которая будет прерываться, когда expr либо считывается, либо записывается программой.

Команды могут быть прикреплены к точкам наблюдения: https://sourceware.org/gdb/onlinedocs/gdb/Break-Commands.html#Break-Commands

Вы можете дать любой точке останова (или точке наблюдения, или точке перехвата) серию команд для выполнения, когда ваша программа останавливается из-за этой точки останова… Например, вот как вы можете использовать команды точки останова для печатизначение x при входе в foo всякий раз, когда x положительно.

break foo if x>0 
commands 
silent 
printf "x is %d\n",x 
cont 
end

Команда, как правило, должна увеличивать переменную или печатать «чтение / запись» в файл, но вы также можете добавить другие вещи, такие как обратная трассировка.Не уверены в том, как лучше общаться с помощью gdb.Может быть, вам достаточно запустить его в интерактивном режиме.

0 голосов
/ 21 июня 2019

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

Существует несколько инструментов анализа производительности, таких как perf и gprofпрофилировщики.

Кроме того, выполнение внутри виртуальной машины может (по крайней мере, теоретически) делать то, что вам нужно.valgrind приходит на ум.Я думаю, что Valgrind действительно знает обо всех обращениях к памяти.Я бы искал способы получить эту информацию (а затем сопоставить ее с файлами карт).

Я не знаю, решит ли какой-либо из вышеперечисленных инструментов именно вашу проблему, но вы определенно могли бы использовать, скажем,, perf (если она доступна для вашей платформы), чтобы увидеть, на что областей кода потрачено значительное время.Тогда, вероятно, существует либо много дорогостоящих обращений к памяти, либо просто интенсивные вычисления, вы можете выяснить, в чем дело, посмотрев на код.

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

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

0 голосов
/ 21 июня 2019

Вы можете сделать это, используя Visual Studio (или другую IDE): искать все места, где ваша переменная используется в исходном коде, ставить условную точку останова, регистрировать некоторую информацию, прикреплять к процессу и запускать функции, которыеиспользуйте эту переменную.Вы можете сосчитать экземпляры в окне вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...