Почему Linux perf использует событие l1d.replacement для "L1 dcache misses" на x86?
На Intel x86 Linux использует событие l1d.replacements
реализовать его L1-dcache-load-misses
событие.
Это событие определяется следующим образом:
Подсчитывает замены строк данных L1D, включая случайные замены, и замены, которые требуют остановки или замены.
Возможно, наивно я бы ожидал perf
использовать что-то вроде mem_load_retired.l1_miss
, который поддерживает PEBS и определяется как:
Считает удаленные инструкции загрузки по крайней мере с одним мопом, пропущенным в кеше L1. (Поддерживает PEBS)
Значения событий обычно не очень близки, а иногда они сильно различаются. Например:
$ocperf stat -e mem_inst_retired.all_loads,l1d.replacement,mem_load_retired.l1_hit,mem_load_retired.l1_miss,mem_load_retired_fb_hit head -c100M /dev/urandom > /dev/null
Performance counter stats for 'head -c100M /dev/urandom':
445,662,315 mem_inst_retired_all_loads
92,968 l1d_replacement
443,864,439 mem_load_retired_l1_hit
1,694,671 mem_load_retired_l1_miss
28,080 mem_load_retired_fb_hit
Есть более чем в 17 раз больше "промахов L1", измеренных mem_load_retired.l1_miss
по сравнению с l1d.replacement
, И наоборот, вы также можете найти примеры, где l1d.replacement
намного выше, чем mem_load_retired
счетчики.
Что именно l1d.replacement
измерение, почему оно было выбрано в ядре, и является ли он лучшим прокси для пропусков d-кэша L1, чем mem_load_retired.l1_miss
?