_mm_lfence()时间开销是不确定的?

Ana*_*ani 5 c performance x86 intrinsics rdtsc

我试图确定读取元素所需的时间,以确保它是缓存命中或缓存未命中.为了阅读顺序我使用_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;
}
Run Code Online (Sandbox Code Playgroud)

arr中的值在不同的范围内变化,arr_size为100 000.

Pet*_*des 3

我在一次迭代中得到了超过 1000 个时钟周期的结果,而下一次则为 200 个。

听起来你的 CPU 在前几次迭代后从空闲状态提升到了正常时钟速度。

请记住,RDTSC 计算的是参考周期(固定频率,等于或接近 CPU 的最大非睿频频率),而不是核心时钟周期。(怠速/涡轮/任何)。较旧的 CPU 有 RDTSC 计数核心时钟周期,但多年来,CPU 供应商已经固定了 RDTSC 频率,使其非常有用clock_gettime(),并通过invariant_tscCPUID 功能位来宣传这一事实。另请参阅获取 CPU 周期计数?

如果您确实想使用 RDTSC 而不是性能计数器,请禁用 Turbo 并使用预热循环使 CPU 达到最大频率。


有一些库可让您对硬件性能计数器进行编程并设置权限,以便您可以rdpmc在用户空间中运行。这实际上比rdtsc. 有关访问用户空间中的性能计数器的方法摘要,请参阅获取 Intel Kaby Lake 架构上最后一级缓存未命中计数的确切代码是什么。

rdpmc我还找到了一篇关于向 Linux添加用户空间支持perf(PAPI)的论文:ftp ://ftp.cs.uoregon.edu/pub/malony/ESPT/Papers/espt-paper-1.pdf 。IDK 是否已将其纳入主线内核/性能代码。