В 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
?