为什么Linux性能在x86上将事件l1d.replacement用于“ L1 dcache丢失”?

Bee*_*ope 6 linux x86 profiling perf intel-pmu

在Intel x86上,Linux使用事件l1d.replacements来实现其事件。L1-dcache-load-misses事件。

此事件的定义如下:

计算L1D数据线的替换量,包括机会性替换,以及需要停顿替换的替换或需要替换块的替换。

也许天真地,我希望perf使用像这样的东西mem_load_retired.l1_miss,它支持PEBS,并且定义为:

用至少一个在L1高速缓存中未命中的uop计数退休的加载指令。(支持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                                     
Run Code Online (Sandbox Code Playgroud)

与相比,“ L1未命中”的数量多于17 。相反,您也可以找到比计数器高得多的示例。mem_load_retired.l1_missl1d.replacementl1d.replacementmem_load_retired

到底在l1d.replacement测量什么,为什么要在内核中选择它,并且它比L1 d缓存未命中更好的代理mem_load_retired.l1_miss