如何使用硬件计数器获取上一级缓存未命中事件信息?

时间:2018-09-23 15:43:10

标签: caching memory-access papi

我正在尝试收集有关使用malloc或calloc专门分配的内存块的最后一级高速缓存未命中的信息。例如

#include <iostream>
#include <cstdlib>
#include <papi.h>

using namespace std;

void handle_error(int err){
    cout << "PAPI error: " << err << endl;
};

int main(int argc, char* argv[]){
    int *p;
    int numEvents = 2;
    long long values[2];
    int events[2] = {PAPI_L3_TCA,PAPI_L3_TCM};
    int n = 1000000;

    p = (int *) malloc(n * sizeof(int));
    cout << p << endl;

    if (PAPI_start_counters(events, numEvents) != PAPI_OK) {
        handle_error(1);
    }

    for (int i = 0; i < n; ++i) {
        *(p + i) = i;
    }

    if ( PAPI_stop_counters(values, numEvents) != PAPI_OK) {
        handle_error(1);
    }

    free(p);

    cout<<"L3 accesses: "<<values[0]<<endl;
    cout<<"L3 misses: "<<values[1]<<endl;
    cout<<"L3 miss/access ratio: "<<(double)values[1]/values[0]<<endl;

    return 0;
};

因此在此示例中,我可以使用PAPI库获取上一级缓存未命中的计数。此示例的输出是

0x7fc11aaff010
L3 accesses: 589
L3 misses: 196
L3 miss/access ratio: 0.332767

但是我不仅想要计数。 我想获取有关访问内存地址以读取缓存中不存在的数据以及读取的数据大小的信息。

例如,您在输出中看到的内存地址是malloc返回的虚拟基本内存地址。由于malloc进行连续的内存分配,因此我可以通过基地址+大小来计算最终虚拟内存地址。发生高速缓存未命中时,能否获得那些访问过的内存地址?

我正在阅读此Unimem paper,论文陈述了以下技术

  

我们依靠广泛部署的硬件性能计数器   在现代处理器中。特别收集最后的数   级别的缓存未命中事件,然后将事件信息映射到   数据对象。充分利用通用采样模式的性能   计数器(例如,来自Intel的基于事件的精确采样或   AMD的基于指令的采样),我们收集内存地址   其相关的内存引用导致最后一级缓存   错过。这些内存地址可帮助我们识别目标数据对象   在主内存中具有频繁内存访问权限的人。

所以我的问题是,除了使用硬件计数器对上一级缓存未命中进行计数外,还有什么方法可以获取更多信息?

0 个答案:

没有答案