我正在尝试确定读取元素以确保它是缓存命中或缓存未命中所需的时间。为了阅读顺序,我使用 _mm_lfence() 函数。我得到了意想不到的结果,检查后我发现 lfence 函数的开销不是确定性的。因此,我正在执行程序,该程序在例如 100 000 次迭代的循环中测量此开销。我在一次迭代中得到超过 1000 个时钟周期的结果,下一次是 200 个。lfence 函数开销之间存在这种差异的原因可能是什么,如果它如此不可靠,我如何才能正确判断缓存命中和缓存未命中的延迟?我试图使用与这篇文章相同的方法:内存延迟测量与时间戳计数器
给出不可靠结果的代码是这样的:
for(int i=0; i < arr_size; i++){
_mm_mfence();
_mm_lfence();
t1 = __rdtsc();
_mm_lfence();
_mm_lfence();
t2 = __rdtsc();
_mm_lfence();
arr[i] = t2-t1;
}
arr 中的值在不同的范围内变化,arr_size 为 100 000。