Профилирование кэш-памяти второго уровня на CUDA Compute 3.x с nvprof
У меня проблема с профилированием кэша L2 на моей карте CUDA с вычислительными возможностями 3.5. В Kepler (3.x) нагрузки из глобальной памяти кэшируются только в L2 и никогда в L1. Мой вопрос: как мне использовать nvprof (профилировщик командной строки), чтобы найти частоту попаданий, которую достигают мои глобальные нагрузки в кеше L2? Я запросил все метрики, которые я могу собрать, и те, которые связаны с болью L2:
l2_l1_read_hit_rate: Hit rate at L2 cache for all read requests from L1 cache
l2_texture_read_hit_rate: Hit rate at L2 cache for all read requests from texture cache
l2_l1_read_throughput: Memory read throughput seen at L2 cache for read requests from L1 cache
l2_texture_read_throughput: Memory read throughput seen at L2 cache for read requests from the texture cache
l2_read_transactions: Memory read transactions seen at L2 cache for all read requests
l2_write_transactions: Memory write transactions seen at L2 cache for all write requests
l2_read_throughput: Memory read throughput seen at L2 cache for all read requests
l2_write_throughput: Memory write throughput seen at L2 cache for all write requests
l2_utilization: The utilization level of the L2 cache relative to the peak utilization
Единственный коэффициент попадания, который я получаю, - это чтение с L1. Но чтения в глобальную память никогда не поступят из L1, поскольку они там не кэшируются! Или я здесь не прав, и это именно тот показатель, который мне нужен?
Удивительно (или нет) есть показатель, показывающий частоту попаданий L1 для чтения из глобальной памяти.
l1_cache_global_hit_rate: Hit rate in L1 cache for global loads
Может ли это быть ненулевым для Кеплера?
Ура!
2 ответа
На устройствах CC 3.5 есть два пути для глобальных нагрузок. Инструкция LDG проходит через блок текстуры (l2_texture_read_hit_rate). Все другие глобальные операции загрузки, включая некэшированные загрузки, проходят от L1 до L2 (l2_l1_read_hit_rate). Имена счетчиков: l2__read_hit_rate. Этот счетчик не означает, что нагрузка была кэширована в L1.
Счетчик l1_cached_global_hit_rate может быть ненулевым на GK110B и GK210, если разработчик включает кэш L1. Подробнее см. В разделе "Руководство по настройке Kepler" кэш-памяти L1.
При компиляции nvcc по умолчанию это будет 0. Однако, если вы компилируете с -Xptxas -dlcm=ca, тогда он может быть ненулевым.