Инструкция 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, но я не знаю, как он работает в этой микроархитектуре.

Другие вопросы по тегам