Согласно Руководству разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 1: Базовая архитектура, глава «Программирование с использованием расширений Intel Streaming SIMD (Intel SSE)»:
Кеширование временных и вневременных данных
Данные, на которые ссылается программа, могут быть временными (данные будут использоваться снова) или невременными (данные будут ссылаться один раз и не будут использоваться повторно в ближайшем будущем). Например, программный код обычно носит временный характер, тогда как мультимедийные данные, такие как список отображения в приложении трехмерной графики, часто не являются временными. Чтобы эффективно использовать кеши процессора, обычно желательно кэшировать временные данные, а не кэшировать невременные данные. Перегрузка кэшей процессора невременными данными иногда называется «загрязнением кешей». Команды управления кэшируемостью SSE и SSE2 позволяют программе записывать невременные данные в память таким образом, чтобы минимизировать загрязнение кешей.
Описание невременных инструкций по загрузке и хранению. Источник: Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 2: Справочник по набору инструкций
ЗАГРУЗИТЬ (MOVNTDQA - загрузить подсказку с двойным четырехсловым без временного выравнивания)
Загружает двойное четверное слово из исходного операнда (второй операнд) в целевой операнд (первый операнд) с использованием невременной подсказки, если источником памяти является тип памяти WC (объединение записи) [...]
[...] процессор не считывает данные в иерархию кеша и не извлекает соответствующую строку кеша из памяти в иерархию кеша.
Обратите внимание, что, как комментирует Питер Кордес, это бесполезно для обычной памяти WB (с обратной записью) на текущих процессорах, потому что подсказка NT игнорируется (вероятно, потому, что нет предварительных выборок HW с поддержкой NT) и применяется полная строго упорядоченная семантика загрузки , prefetchnta
может использоваться как уменьшающая загрязнение нагрузка из памяти WB
СОХРАНИТЬ (MOVNTDQ - хранить упакованные целые числа с помощью вневременной подсказки)
Перемещает упакованные целые числа в исходном операнде (втором операнде) в целевой операнд (первый операнд), используя невременную подсказку, чтобы предотвратить кэширование данных во время записи в память.
[...] процессор не записывает данные в иерархию кеша и не извлекает соответствующую строку кэша из памяти в иерархию кеша.
Используя терминологию, определенную в разделе Политики записи в кэш и производительность , их можно рассматривать как обратную запись (без записи-выделения, без выборки при пропуске записи).
Наконец, может быть интересно просмотреть заметки Джона Макалпина о вневременных хранилищах .
MOVNTDQA xmmi, m128
является загрузкой NT, тогда как все остальные инструкции NT являются сохранением, за исключениемprefetchnta
. В принятом здесь ответе, похоже, говорится только о магазинах. Это то, что я обнаружил в отношении NT-нагрузок . TL: DR: надеюсь, что CPU делает что-то полезное с подсказкой NT, чтобы минимизировать загрязнение кеша, но они не отменяют строго упорядоченную семантику «нормальной» WB-памяти, поэтому они должны использовать кеш.