2008-08-31 12 views
81

Это несколько низкий вопрос. В сборке x86 есть два SSE инструкции:Что означает «не временные» обращения к памяти в x86

MOVDQA xmmi, m128

и

Руководство MOVNTDQA xmmi, m128

IA-32 Software Developer говорит, что NT в MOVNTDQA означает Non -Temporal, и в противном случае это то же самое, что и MOVDQA.

Мой вопрос: что такое Non-Temporal означает?

+1

Обратите внимание, что SSE4.1 `MOVNTDQA xmmi, m128` является загрузкой NT, тогда как все остальные команды NT являются хранилищами, за исключением` prefetchnta`. Принятый здесь ответ только говорит о магазинах. [Это то, что я смог узнать о загрузках NT) (http://stackoverflow.com/questions/32103968/non-temporal-loads-and-the-hardware-prefetcher-do-they-work-together). TL: DR: надеюсь, что процессор делает что-то полезное с подсказкой NT, чтобы минимизировать загрязнение кэша, но они не переопределяют сильно упорядоченную семантику «нормальной» WB-памяти, поэтому они должны использовать кеш. – 2016-11-23 07:25:27

+1

Обновление: NT * загружает * может не делать ничего полезного, кроме областей памяти UCSW на большинстве процессоров (например, семейство Intel SnB). NT/streaming * сохраняет * определенно работают на нормальную память. – 2017-07-08 01:18:47

+0

@Peter: Вы имеете в виду USWC-память?Раньше я никогда не слышал о UCSW или USWC-памяти. Неправильная аббревиатура не была полезной :-) – 2017-08-15 11:29:43

ответ

106

Невременные инструкции SSE (MOVNTI, MOVNTQ и т. Д.) Не соответствуют нормам кэш-когерентности. Поэтому для невременных магазинов должна следовать инструкция SFENCE, чтобы их результаты могли быть замечены другими процессорами своевременно.

Когда данные производятся, а не (сразу же) потребляются снова, тот факт, что операции хранения памяти сначала считывают полную строку кеша, а затем модифицируют кэшированные данные, наносят ущерб производительности. Эта операция выталкивает данные из кэшей, которые могут потребоваться снова в пользу данных, которые не будут использоваться в ближайшее время. Это особенно справедливо для больших структур данных, таких как матрицы, которые заполняются, а затем используются позже. Перед заполнением последнего элемента матрицы чистый размер вытесняет первые элементы, делая кеширование записей неэффективными.

Для этой и подобных ситуаций процессоры обеспечивают поддержку операций, не связанных с временной записью. В этом контексте невременно означает, что данные не будут повторно использоваться в будущем, поэтому нет причин его кэшировать. Эти операции с невременной записью не читают строку кэша, а затем изменяют ее; вместо этого новый контент непосредственно записывается в память.

Источник: http://lwn.net/Articles/255364/

29

Эспо довольно много взрыва на цель. Просто хотел добавить мои два цента:

«Невременная» фраза означает отсутствие временной области. Кэши используют два типа местностей - пространственные и временные, а также используя невременную инструкцию, которую вы сигнализируете процессору, что вы не ожидаете, что элемент данных будет использоваться в ближайшем будущем.

Я немного скептически отношусь к сборке с ручной кодировкой, которая использует инструкции управления кешем. По моему опыту эти вещи приводят к более злым ошибкам, чем любая эффективная производительность.