Что означает "не временные" обращения к памяти в x86
Это вопрос несколько низкого уровня. В сборке x86 есть две инструкции SSE:
MOVDQA xmmi, m128
а также
MOVNTDQA xmmi, m128
В Руководстве разработчика программного обеспечения IA-32 говорится, что NT в MOVNTDQA обозначает Non-Temporal, а в остальном он такой же, как MOVDQA.
У меня вопрос, что означает Non-Temporal?
3 ответа
Временные инструкции SSE (MOVNTI, MOVNTQ и т. Д.) Не следуют нормальным правилам когерентности кэша. Поэтому за временными хранилищами должна следовать инструкция SFENCE, чтобы другие процессоры своевременно видели их результаты.
Когда данные создаются и не (сразу) потребляются снова, тот факт, что операции хранения памяти сначала читают полную строку кэша, а затем изменяют кэшированные данные, отрицательно сказывается на производительности. Эта операция выталкивает данные из кэшей, которые могут понадобиться снова, в пользу данных, которые в ближайшее время не будут использоваться. Это особенно верно для больших структур данных, таких как матрицы, которые заполняются и затем используются позже. До того, как последний элемент матрицы заполнен, из-за большого размера удаляются первые элементы, что делает кеширование записей неэффективным.
Для этой и подобных ситуаций процессоры обеспечивают поддержку невременных операций записи. Временной в этом контексте означает, что данные не будут повторно использованы в ближайшее время, поэтому нет никаких оснований для их кэширования. Эти невременные операции записи не читают строку кэша и затем изменяют ее; вместо этого новый контент записывается непосредственно в память.
Источник: http://lwn.net/Articles/255364/
Эспо сильно бьет по воротам. Просто хотел добавить мои два цента:
"Невременная" фраза означает отсутствие временной локализации. Кэши используют два вида локальности - пространственную и временную, и, используя невременную инструкцию, вы сигнализируете процессору, что не ожидаете, что элемент данных будет использован в ближайшем будущем.
Я немного скептически отношусь к сборке с ручным кодированием, которая использует инструкции управления кешем. По моему опыту, эти вещи приводят к большему количеству злых ошибок, чем любое эффективное повышение производительности.
В соответствии с Руководством разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 1: Базовая архитектура, глава "Программирование с помощью потоковых SIMD-расширений Intel (Intel SSE)":
Кэширование временных и не временных данных
Данные, на которые ссылается программа, могут быть временными (данные будут использоваться снова) или не временными (на данные будут ссылаться один раз, и они не будут использоваться повторно в ближайшем будущем). Например, программный код обычно является временным, тогда как мультимедийные данные, такие как список отображения в приложении для трехмерной графики, часто являются временными. Чтобы эффективно использовать кэши процессора, обычно желательно кэшировать временные данные, а не кэшировать невременные данные. Перегрузка кешей процессора невременными данными иногда называется "загрязнение кешей". Команды управления кешируемостью SSE и SSE2 позволяют программе записывать невременные данные в память таким образом, чтобы минимизировать загрязнение кешей.
Описание невременной загрузки и хранения инструкций. Источник: Руководство разработчика программного обеспечения для архитектуры Intel 64 и IA-32, том 2: Справочник по наборам инструкций
ЗАГРУЗИТЬ (MOVNTDQA - загрузить подсказку о невременном выравнивании по двойному слову)
Загружает двойное четырехзначное слово из исходного операнда (второй операнд) в целевой операнд (первый операнд), используя не временную подсказку, если источником памяти является тип памяти WC (с комбинированием записи) [...]
[...] процессор не считывает данные в иерархию кэша и не извлекает соответствующую строку кэша из памяти в иерархию кэша.
Обратите внимание, что, как комментирует Питер Кордес, это бесполезно для обычной памяти WB (с обратной записью) на текущих процессорах, потому что подсказка NT игнорируется (возможно, потому что нет NT Hare prefetchers), и применяется полная строго упорядоченная семантика загрузки., prefetchnta
может использоваться в качестве уменьшающей загрязнение нагрузки из памяти ББ
STORE (MOVNTDQ - хранить упакованные целые числа, используя временную подсказку)
Перемещает упакованные целые числа в исходном операнде (второй операнд) в целевой операнд (первый операнд), используя временную подсказку, чтобы предотвратить кэширование данных во время записи в память.
[...] процессор не записывает данные в иерархию кэша и не извлекает соответствующую строку кэша из памяти в иерархию кэша.
Используя терминологию, определенную в Cache Write Policies and Performance, они могут рассматриваться как обходные записи (no-write-allocate, no-fetch-on-write-miss).
Наконец, может быть интересно просмотреть заметки Джона Макалпина о не временных магазинах.