У меня есть часть программного обеспечения, которая использует сложные структуры данных, и я хотел бы понять, как программа использует различные кэши и регистры.
Вопрос:
В настоящее время я использую Visual Studio, поэтому плагин будет предпочтительнее, но программа компилируется с помощью gcc.
Изменить: профилировщики, такие как CodeAnalyst и CacheGrind, похоже, делают такие вещи только после выполнения программы, как это делает профилировщик, но меня больше интересует понимание пошагового поведения при выполнении.
пример
Code Line 1; // break here and show which variables are currently stored where.
Code Line 2;
for(int i=0; i<some_var; i++) {
Code Line 3; // break here and compare cache contents.
}
Я боюсь, что вы не сможете смотреть прямо в состояние кэша во время выполнения, так как сам процесс поиска, особенно если задействованы точки останова, или некоторый код, который будет управлять этой проверкой, сильно повлияет на состояние кэша, практически уничтожая то, что вы пытались осмотреть. Хуже — это предполагает, что вы можете получить какую-то картинку из кеша или создать дамп с помощью простого кода — что не так.
На самом деле, даже если бы вы должны были волшебным образом получить представление о состоянии кэша в данный момент, вряд ли это что-то будет значить через несколько микросекунд, поскольку отображение страниц может постоянно различаться, строки выбираются и выбрасываются из кэша. время, и весь кэш может быть очищен. Фактически, ядро или процессор могут даже остановиться на короткое отключение питания, автоматически сбросив все данные в кеше в процессе.
Вот 3 способа проверить контекст кэша ненавязчивым способом:
Используйте симулятор, который может представить это состояние в любой момент. Существуют различные симуляторы кэша и процессора, я упомянул несколько здесь — Реализация структуры моделирования кэша
Недостатком является то, что ни один из них не может гарантировать регенерирование точно такого же сценария, как у вас на вашем реальном процессоре. Имитатор кэша нереалистичен, поскольку упрощает все обращения к одному линейному потоку, игнорируя, например, например, те из них в реальном процессоре, которые были сброшены из-за неправильных прогнозов веток. Отсутствие элемента синхронизации также может изменить поведение политики замены и дать вам другие результаты. Это вряд ли будет проблемой, это должно иметь значение только в реальных угловых случаях, но просто имейте это в виду. Симуляторы времени более реалистичны и имеют больше шансов воспроизвести ваши проблемы, но ни один из доступных не обязательно будет моделировать ту же микро-архитектуру, что и ваш процессор. Вы можете настроить их так, чтобы они были как можно ближе.
Используйте внутренние счетчики производительности ЦП для отслеживания статистики, связанной с кешем. Это дает вам реальную картину, но, к сожалению, обеспечивает меньшую видимость, определенно не в режиме реального времени. Некоторые профилировщики (включая Vtune и тому подобное) могут сделать за вас грязную работу и представить эти статистические данные, отобранные с течением времени, что может быть более полезным.
Добавьте выделенный код, который вызывается программно, когда вы хотите проверить содержимое кэша. Этот код может затем выполнить некоторые (ограниченные) проверки, например, угадать, существует ли определенная строка в кэше, используя поиск по времени. Это довольно сложно, но может подойти лучше, если вы посмотрите на определенные строки там. Я только заметил, что я написал ненавязчивым способом — поцарапайте это, этот путь конечно очень навязчив.
Вы также можете использовать CodeAnalyst от AMD (бесплатно) или VTune от Intel (платное, но с бесплатной пробной версией). Оба графические, в отличие от Valgrind