Инструкция Intel CLWB, делающая строки кэша недействительными
Я пытаюсь найти конфигурацию или шаблон доступа к памяти для инструкции Intel clwb, которая не сделала бы строку кэша недействительной. Я тестирую процессор Intel Xeon Gold 5218 с модулями памяти NVDIMM. Версия для Linux - 5.4.0-3-amd64. Я попытался использовать режим Device -DAX и напрямую сопоставить это символьное устройство с адресным пространством. Я также попытался добавить эту энергонезависимую память в качестве нового узла NUMA и использоватьnumactl --membind
команда для привязки к нему памяти. В обоих случаях, когда я использую clwb для кэшированного адреса, он удаляется. Я наблюдаю выселение с аппаратными счетчиками PAPI, с отключенными предварительными выборками.
Это простой цикл, который я тестирую. массив и переменная tmp объявлены как изменчивые, поэтому загрузка действительно выполняется.
for(int i=0; i < arr_size; i++){
tmp = array[i];
_mm_clwb(& array[i]);
_mm_mfence();
tmp = array[i];
}
Оба чтения дают промахи в кэше.
Мне было интересно, пытался ли кто-нибудь еще определить, существует ли какая-то конфигурация или шаблон доступа к памяти, который оставил бы строку кеша в кеше?
1 ответ
clwb
ведет себя как clflushopt
на SKX и CSL. Однако программы, использующиеclwb
на этих процессорах автоматически выиграет при запуске в будущем процессе, поддерживающем оптимизированную реализацию clwb
.
В разделе 2.1.1.4 Руководства по оптимизации Intel (сентябрь 2019 г.) упоминается, что clwb
новинка в Ice Lake Client. Возможно, это означает, что преимущество в производительностиclwb
новинка на Ice Lake. Хотяcpuid
информация о листе 0x7 из InstLatx64 говорит, что ICL не поддерживаетclwb
. Я не уверен, кто здесь виноват. Кто-то должен проверить, действительно ли_mm_clwb(void const *p)
работает на ICL. В любом случае, скорее всего, он будет поддерживаться на ICX.
clwb
также поддерживается в Zen 2, но я не знаю, как он работает в этой микроархитектуре.