我正在尝试使用英特尔性能计数器监控器(PCM)来了解L3缓存未命中以及代码中的其他一些性能标准。
我不确定如何从我得到的数字中弄清楚,并希望获得一些见识。
理想情况下,我希望从下面的代码中读取0字节,但是我得到的数字接近240KB。如果我尝试运行其他进程,则240KB的数字会波动(不会单调上升/下降,而是会产生有意义的波动(先上升然后下降))。
volatile SystemCounterState before_sstate = getSystemCounterState();
volatile SystemCounterState after_sstate = getSystemCounterState();
cout << "Instructions per clock: " << getIPC( before_sstate, after_sstate )
<< ", L3 Cache hit ratio: " << getL3CacheHitRatio( before_sstate, after_sstate )
<< ", L3 Missed Cycles: " << getCyclesLostDueL3CacheMisses(before_sstate, after_sstate )
<< ", Bytes read: " << getBytesReadFromMC( before_sstate, after_sstate )
<< ", L3 Occupancy: " << getL3CacheOccupancy( after_sstate ) << endl;
这是我得到的输出:
尝试使用Linux性能事件...
使用Linux性能成功编程的内核PMU
每时钟指令:0.637448,三级高速缓存命中率:0.820139,丢失周期:0.075492,读字节:263488,三级占用率:0
有人知道为什么我实际上没有读取任何内容,但为什么我却读取了240KB吗?它是否与其他进程共享计算资源,并可能还会从其他进程中获取统计信息? 如果是这样,我如何确保捕获的信息与正在运行的此代码/进程隔离?