Мне интересно, есть ли какое-нибудь отдельное событие, которое может фиксировать промахи кеша L1D. Я попытался зафиксировать промах кэша L1d, измерив задержку для доступа к определенной памяти с помощью rdtsc в начале. В моих настройках, если происходит промах кеша L1d, он должен попасть в кеш L2. Поэтому я измеряю задержку доступа к памяти с помощью RDTSC и сравниваю ее с задержкой кэша L1 и задержкой кэша L2. Однако из-за шума я не могу понять, попадает ли он в L1 или L2. Поэтому я решил использовать RDPMC.
Я обнаружил, что несколько API-интерфейсов предоставляют некоторые функции для простого отслеживания событий perf, но я хотел бы использовать инструкцию RDPMC непосредственно в своей тестовой программе. Я обнаружил, что MEM_INST_RETIRED.ALL_LOADS-MEM_LOAD_RETIRED.L1_HIT можно использовать для подсчета количества удаленных инструкций загрузки, которые отсутствуют в L1D. (подсчет промахов кэша L1 с помощью PAPI_read_counters дает неожиданные результаты). Однако похоже, что в этом посте говорится о papi Api.
Как я могу найти, какие значения должны быть присвоены регистру ecx перед выполнением инструкции rdpmc для захвата определенных событий? Кроме того, мне интересно, есть ли какое-либо отдельное событие, которое может сказать мне, что промах L1 происходит для одной инструкции загрузки памяти между двумя инструкциями rdpmc, расположенными рядом друг с другом, как показано ниже.
c = XXX; //I don't know what value should be assigned for what perf counter..
asm volatile(
"lfence"
"rdpmc"
"lfence"
"mov (0xdeadbeef), %%r10"//read memory
"mov %%eax, %%r10 //read lower 32 bits of counter
"lfence"
"rdpmc" //another rdpmc to capture difference
"sub %%r10, %%eax //sub two counter to get difference
:"=a"(a)
:"c"(c)
:"r10", "edx");
В настоящее время я использую кофемашину с кофейным озером 9900k, поэтому я поискал номер счетчика производительности для машины с кофе-озером в руководстве Intel. Кажется, что просто захвата двух MEM_LOAD_RETIRED.L1_HIT до и после инструкции загрузки достаточно, чтобы захватить событие, но я не уверен, можно ли это сделать .. Также я не знаю, как кодировать это событие perf как Регистр ecx.
Наконец, мне интересно, требует ли последовательная инструкция rdpmc каких-либо инструкций сериализации. В моем случае, поскольку я помещаю только инструкцию загрузки и измеряю, происходит ли промах кэша L1d или нет, я заключаю первую инструкцию rdpmc с инструкцией lfence и помещаю еще одну инструкцию lfence перед последним rdpmc, чтобы гарантировать, что инструкция загрузки завершится до второго rdpmc.
Добавлен код
asm volatile (
"lfence\n\t"
"rdpmc\n\t"
"lfence\n\t"
"mov %%eax, %%esi\n\t"
//measure
"mov (%4), %%r10\n\t"
"lfence\n\t"
"rdpmc\n\t"
"lfence\n\t"
"sub %%esi, %%eax\n\t"
"mov %%eax, (%0)\n\t"
:
:"r"(&perf[1]), "r"(&perf[2]), "r"(&perf[3]),
"r"(myAddr), "c"(0x0)
:"eax","edx","esi","r10", "memory");
Также я закрепил свое ядро номер 3 с помощью isolcpu и отключил гиперпоточность для тестирования. Регистр MSR был вычислен с помощью команды ниже
sudo wrmsr -p 3 0x186 0x4108D1 #L1 MISS
"\n"
в конце каждой строки этого встроенного asm-оператора; конкатенация строк вставит весь этот текст вместе без пробелов. - person Peter Cordes   schedule 06.10.2020lfence
околоrdpmc
, вероятно, понадобится; Я не думаю, что он ждет, пока предыдущая инструкция не исчезнет, прежде чем читать счетчик. Кстати, современный GCC имеет не сломанный__rdpmc
внутренний. (Более старый GCC забыл рассматривать его какvolatile
, так же как и CSE). Извините, я не знаю с помощью PAPI, как узнать, какой номер HW-счетчика ядро выбрало для события. - person Peter Cordes   schedule 06.10.2020echo 2 > /sys/bus/event_source/devices/cpu/rdpmc
); с включенным доступом только к ядру Linux. Существуют методы измерения задержки кэша без счетчиков производительности: 7-cpu.com/utils.html и lmbench / src / lat_mem_rd.c - person osgx   schedule 08.10.2020"=&a(perf[1])
Early-clobber и просто опустите это последнееmov
сохранение в(%0)
. Позвольте компилятору обрабатывать перемещение данных за пределы временной области. (Выполнение подпрограммы внутри может упростить ограничения, но вы можете просто произвести запуск и остановку вывода.) - person Peter Cordes   schedule 09.10.2020end-start
. Нет необходимости иметь инструкциюsub
как часть шаблона asm. - person Peter Cordes   schedule 09.10.2020