У Intel есть технический документ по копированию из видеопамяти. в основную память; это должно быть похоже, но намного проще (потому что данные умещаются в 2 или 4 векторных регистрах).
Он говорит, что загрузка NT будет извлекать целую строку кэша данных из памяти WC в LFB:
Обычные инструкции загрузки извлекают данные из памяти USWC в единицах того же размера, что и запрашиваемые инструкции. Напротив, инструкция потоковой загрузки, такая как MOVNTDQA, обычно вытягивает полную строку данных кэша в специальный «буфер заполнения» в ЦП. Последующие потоковые загрузки будут считываться из этого буфера заполнения, вызывая гораздо меньшую задержку.
Используйте AVX2 _ 1_ или 128-битная версия SSE4.1 / AVX1.
Буферы заполнения - это ограниченный ресурс, поэтому вы определенно хотите, чтобы компилятор сгенерировал asm, который выполняет две выровненные загрузки 64-байтовой строки кэша последовательно, затем сохраняя в обычной памяти.
Если вы обрабатываете более одного 64-байтового блока за раз, см. Технический документ Intel, в котором есть предложение по использованию небольшого буфера отказов, который остается горячим в L1d, чтобы избежать смешивания хранилищ в DRAM с загрузками NT. (Вытеснения L1d в DRAM, как и хранилища NT, также требуют буферов заполнения строк, LFB).
Обратите внимание, что _ 2_ бесполезен вообще для типов памяти, отличных от WC. Подсказка NT игнорируется на текущем оборудовании, но в любом случае требует дополнительной нагрузки ALU по сравнению с обычной нагрузкой. Есть prefetchnta
, но это совсем другой зверь.
person
Peter Cordes
schedule
19.08.2018