是否可以使用英特尔的PMU库来计算C程序中特定代码段的缓存命中/未命中数?计数似乎受到系统上运行的其他应用程序的污染。
该库是否支持隔离与一个特定代码段相对应的缓存统计信息(即,不受系统上运行的其他应用程序的干扰)?
这是我用
测试的代码片段SystemCounterState before = getSystemCounterState();
SystemCounterState after = getSystemCounterState();
cout << "===========================================================" << endl;
cout << "Instructions per Clock: " << getIPC(before, after) <<
"\nL2 cache hits: " << getL2CacheHits(before, after) <<
"\nL2 cache misses: " << getL2CacheMisses(before, after) <<
"\nL2 cache hit ratio: " << getL2CacheHitRatio(before, after) <<
"\nL3 cache hits: " << getL3CacheHits(before, after) <<
"\nL3 cache misses: " << getL3CacheMisses(before, after) <<
"\nL3 cache hit ratio: " << getL3CacheHitRatio(before, after) <<
"\nWasted cycles caused by L3 misses: " << getCyclesLostDueL3CacheMisses(before, after) <<
"\nBytes read from DRAM: " << getBytesReadFromMC(before, after) << endl;
cout << "===========================================================" << endl;
这些是我得到的统计数据(请注意,虽然我没有做任何计算,但缓存命中/未命中计数很高):
===========================================================
Instructions per Clock: 0.410805
L2 cache hits: 2677
L2 cache misses: 2658
L2 cache hit ratio: 0.501781
L3 cache hits: 2151
L3 cache misses: 507
L3 cache hit ratio: 0.809255
Wasted cycles caused by L3 misses: 0.0242752
Bytes read from DRAM: 514048
===========================================================
提前致谢。
答案 0 :(得分:0)
只需打印&#34;根本不打印任何计算&#34;实际上是在做计算。
您正在调用C ++例程&#39; cout&#39;这会导致相当多的代码执行。如果你想看到这个,请编译这个程序:
#include <iostream>
using namespace std;
int main()
{
int i;
i = 1;
cout << "Hello World" << endl;
i = 2;
}
使用gdb,在cout上设置断点,然后执行&#39; stepi&#39;命令。您会看到在执行“cout”时会执行多少指令。
所有这些指令都执行访问存储器指令本身和指令使用的数据,这可能导致相当多的缓存未命中。
您可能想尝试抓取计数器而不进行任何打印。