Недавно я наткнулся на документ, в котором упоминается: "Если выборка инструкции отсутствует в 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
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