使用英特尔的PMU库来分析缓存命中/未命中的数量

时间:2014-10-07 19:57:50

标签: c++ performance caching intel

是否可以使用英特尔的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
===========================================================

提前致谢。

1 个答案:

答案 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”时会执行多少指令。

所有这些指令都执行访问存储器指令本身和指令使用的数据,这可能导致相当多的缓存未命中。

您可能想尝试抓取计数器而不进行任何打印。