Какова цена промаха кеша

Я анализирую некоторый код и использую cachegrind, чтобы получить количество кэшей (L2 и L3) в выполнении.

Мой вопрос заключается в том, как определить время, затрачиваемое на ожидание, пока кэш не перейдет в режим чтения, на основании его отсутствия?

Я хотел бы иметь возможность сказать что-то вроде: "мой код использует 90% загрузки процессора"

Можно ли сделать это на основе результатов измельчения кэша?

3 ответа

Решение

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

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

Вы можете получить его здесь:

http://software.intel.com/en-us/articles/non-commercial-software-download/

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

Переменная может быть извлечена из кэша за несколько тактов.

Чтобы извлечь его из ОЗУ, если его нет в кеше, может потребоваться более ста тактов.

Другие вопросы по тегам