Как получить информацию о событиях пропуска кэша последнего уровня с помощью аппаратных счетчиков? - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь собрать информацию об отсутствии кэша последнего уровня для блоков памяти, выделенных специально с помощью 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 , и в ней описывается следующая техника

Мы полагаемся на счетчики производительности оборудования, широко используемые в современных процессорах.В частности, мы собираем число событий пропуска кэша последнего уровня, а затем сопоставляем информацию о событии с объектами данных.Используя обычный режим выборки в счетчиках производительности (например, точная выборка на основе событий от Intel или выборка на основе инструкций от AMD), мы собираем адреса памяти, связанные ссылки на память которых вызывают ошибки кэширования последнего уровня.Эти адреса памяти помогают нам идентифицировать целевые объекты данных, которые имеют частый доступ к памяти в основной памяти.

Поэтому мой вопрос заключается в том, что есть какой-то способ получить больше информации, чем просто подсчет пропущенных кэш-памяти последнего уровня с использованием аппаратного обеспечения.счетчик? * * тысяча двадцать-одна

...