количество пропусков в отчетах о перфомансе превышает общее количество обращений

Я использую приведенный ниже код, чтобы понять поведение промахов кеша. Я компилирую код с помощью gcc, а затем сообщаю статистику кеша из команды perf в unix. Я заметил, что количество зарегистрированных промахов намного больше, чем общее количество доступов. Не мог понять причину того же. Если бы кто-нибудь еще видел подобное поведение и мог пролить свет, это действительно помогло бы.

C-код:

#define N 30000

статический массив символов [N] [N];

int main (void) {

register int i,j;

    for (i=0;i<N;i++)

        for(j=0;j<N;j++)

            array[j][i]++;

return 0;

}

команда для компиляции:

gcc test1.c -O0 -o test1.out

команда для запуска инструмента perf:

perf stat -e L1-dcache-load, L1-dcache-load-misses, L1-dcache-store, L1-dcache-store-misses ./test1.out


person rajesh kedia    schedule 16.10.2015    source источник
comment
Было бы полезно добавить результат perf stat в ваше описание. На моей рабочей станции (Intel Xeon E5) результаты совпадают с тем, что вы нашли. 1 200 000 000 пропусков загрузки кэша L1 на 900 000 000 загрузок кэша L1. Это не тот случай, когда компилятор с параметром -O2, но это не объясняет ... Обратите внимание, что с учетом того, как вы получаете доступ к своему массиву, нормально иметь почти 100% пропусков загрузки. Использование array[i][j]++; (последовательное чтение) действительно намного более оптимизировано.   -  person amigadev    schedule 19.10.2015
comment
Это результат статистики производительности на моей машине: 1,78,99,25,227 L1-dcache-load 3,09,12,05,907 L1-dcache-load-misses # 172,70% всех попаданий L1-dcache 1,80,00 , 09,555 L1-dcache-store 1,79,95,15,586 L1-dcache-store-промахов   -  person rajesh kedia    schedule 09.11.2015


Ответы (1)


Недавно я наткнулся на документ, в котором упоминается: "Если выборка инструкции отсутствует в Icache L1, выборка может быть повторена несколько раз, прежде чем инструкции будут возвращены в Icache L1. Событие" промахи Icache L1 "может увеличиваться каждые при попытке выборки, тогда как счетчик доступа к кэш-памяти L2 может увеличиваться только при начальной выборке ". Я не уверен, что это верно для кеша данных или нет.

Если промахи L1 повторяются до загрузки из L2, то же самое и для нагрузок L1. Для массива 30000 на 30000 вы обращаетесь к данным на расстоянии 30000 байтов на каждой итерации, и l1-dcache-load завершается сбоем, следовательно, увеличивается счетчик l1-dcache-load-misses. Затем, прежде чем загружать данные из L2 или LLC, он удаляется, чтобы проверить, действительно ли данные отсутствуют, и дополнительно увеличивает счетчик L1-dcache-load-misses. Это может быть хорошим объяснением вашего случая, когда L1-dcache-load-misses выше, чем L1-dcache-load.

В дополнительном примечании:

Когда вы измеряете производительность процессора программы с помощью perf, измерение содержит циклы процессора, потребляемые вашей программой, и самой программой perf. Поэтому обязательно учитывайте циклы, которые использует только ваша программа. perf-stat может не позволить вам этого сделать. Вы можете использовать perf-record и perf-report, чтобы увидеть загрузки и промахи кеша вашей программой.

Например, вы можете использовать следующую команду perf для записи измерений.

perf record -e L1-dcache-loads,L1-dcache-load-misses,L1-dcache-stores,L1-dcache-store-misses ./test1.out

Затем вы можете использовать следующую команду perf, чтобы просмотреть запись только для вашей программы test1.out.

perf report --dsos=test1.out
person Abdul    schedule 06.11.2015
comment
Я пробовал это, и ниже показано, что я получаю после отчета о перфомансе: l1-dcache-load = 50K, d1-dcache-load-misses = 55K, d1-dcache-store = 52K, d1-dcache-store-misses = 55K - person rajesh kedia; 09.11.2015
comment
Недавно я наткнулся на документ, в котором упоминается, что если выборка инструкции отсутствует в Icache L1, выборка может быть повторена несколько раз, прежде чем инструкции будут возвращены в Icache L1. Событие промаха Icache L1 может увеличиваться при каждой попытке выборки, в то время как счетчик доступа к кэш-памяти L2 может увеличиваться только при начальной выборке. Я не уверен, что это верно для кеша данных или нет. - person Abdul; 09.11.2015
comment
Спасибо за ответ. Но это утверждение справедливо, когда промахи L1 выше, чем доступы L2, что ясно понимается. Проблема здесь в том, что количество промахов L1 больше, чем количество обращений к L1. - person rajesh kedia; 10.11.2015
comment
Если L1 пропускает попытки перед загрузкой из L2, то же самое происходит и с загрузками L1. Для массива 30000 на 30000 вы обращаетесь к данным на расстоянии 30000 байтов на каждой итерации, и l1-dcache-load завершается сбоем, следовательно, увеличивается счетчик l1-dcache-load-misses. Затем, прежде чем загружать данные из L2 или LLC, он удаляется, чтобы проверить, действительно ли данные отсутствуют, и дополнительно увеличивает счетчик L1-dcache-load-misses. Это может быть хорошим объяснением вашего случая, когда L1-dcache-load-misses выше, чем L1-dcache-load. - person Abdul; 12.11.2015