Это вопрос довольно низкого уровня. В сборке x86 есть две инструкции SSE:
MOVDQA xmmi, m128
и
MOVNTDQA xmmi, m128
В Руководстве разработчика программного обеспечения IA-32 говорится, что NT в MOVNTDQA означает Non-Temporal , и что в остальном это то же самое, что и MOVDQA.
У меня вопрос, что означает « Non-Temporal» ?
MOVNTDQA xmmi, m128
является загрузкой NT, тогда как все остальные инструкции NT являются сохранением, за исключениемprefetchnta
. В принятом здесь ответе, похоже, говорится только о магазинах. Это то, что я обнаружил в отношении NT-нагрузок . TL: DR: надеюсь, что CPU делает что-то полезное с подсказкой NT, чтобы минимизировать загрязнение кеша, но они не отменяют строго упорядоченную семантику «нормальной» WB-памяти, поэтому они должны использовать кеш.Ответы:
Невременные инструкции SSE (MOVNTI, MOVNTQ и т. Д.) Не подчиняются обычным правилам когерентности кеша. Поэтому за невременными хранилищами должна следовать инструкция SFENCE, чтобы их результаты могли своевременно увидеть другие процессоры.
Когда данные создаются, а не (немедленно) снова потребляются, тот факт, что операции хранилища памяти сначала читают полную строку кэша, а затем изменяют кэшированные данные, отрицательно сказывается на производительности. Эта операция выталкивает данные из кешей, которые могут понадобиться снова, в пользу данных, которые не будут использоваться в ближайшее время. Это особенно верно для больших структур данных, таких как матрицы, которые заполняются, а затем используются позже. Перед заполнением последнего элемента матрицы из-за огромного размера первые элементы вытесняются, что делает кеширование записей неэффективным.
Для этой и подобных ситуаций процессоры обеспечивают поддержку операций записи вне времени. Невременное в этом контексте означает, что данные не будут использоваться повторно в ближайшее время, поэтому нет причин для их кэширования. Эти невременные операции записи не читают строку кэша и не изменяют ее; вместо этого новый контент напрямую записывается в память.
Источник: http://lwn.net/Articles/255364/
источник
SFENCE
может не понадобиться. По крайней мере, в той же ветке. Не могли бы вы также посмотреть?sfence
это требуется для хранилищ NT, тогда как это никогда не требуется только для обычных хранилищ. Хранилища NT не упорядочиваются по отношению к другим хранилищам (NT или нет) с точки зрения других потоков без расширенияsfence
. Однако для чтения из того же потока, что и хранилища, в этом нет необходимостиsfence
: данный поток всегда будет видеть свои собственные хранилища в программном порядке, независимо от того, являются ли они хранилищами NT или нет.Эспо в значительной степени попадает в цель. Просто хотел добавить свои два цента:
Фраза «вневременной» означает отсутствие временной локальности. Кеши используют два типа локальности - пространственную и временную, и, используя невременную инструкцию, вы сигнализируете процессору, что не ожидаете, что этот элемент данных будет использоваться в ближайшем будущем.
Я немного скептически отношусь к написанной вручную сборке, которая использует инструкции управления кешем. По моему опыту, эти вещи приводят к большему количеству вредоносных ошибок, чем любое эффективное повышение производительности.
источник
Согласно Руководству разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 1: Базовая архитектура, глава «Программирование с использованием расширений Intel Streaming SIMD (Intel SSE)»:
Кеширование временных и вневременных данных
Описание невременных инструкций по загрузке и хранению. Источник: Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 2: Справочник по набору инструкций
ЗАГРУЗИТЬ (MOVNTDQA - загрузить подсказку с двойным четырехсловым без временного выравнивания)
Обратите внимание, что, как комментирует Питер Кордес, это бесполезно для обычной памяти WB (с обратной записью) на текущих процессорах, потому что подсказка NT игнорируется (вероятно, потому, что нет предварительных выборок HW с поддержкой NT) и применяется полная строго упорядоченная семантика загрузки ,
prefetchnta
может использоваться как уменьшающая загрязнение нагрузка из памяти WBСОХРАНИТЬ (MOVNTDQ - хранить упакованные целые числа с помощью вневременной подсказки)
Используя терминологию, определенную в разделе Политики записи в кэш и производительность , их можно рассматривать как обратную запись (без записи-выделения, без выборки при пропуске записи).
Наконец, может быть интересно просмотреть заметки Джона Макалпина о вневременных хранилищах .
источник
MOVNTDQA
делает что-то особенное только в областях памяти WC (некэшируемая запись-объединение), например, в видеопамяти. Это совершенно бесполезно для нормальной памяти WB (с обратной записью) на текущем HW, подсказка NT игнорируется и применяется полная строго упорядоченная семантика загрузки.prefetchnta
Тем не менее, может быть полезен для уменьшения нагрузки на WB-память. Поддерживают ли текущие архитектуры x86 невременные нагрузки (из «нормальной» памяти)? ,