Что означает доступ к невременной памяти в x86

Это вопрос довольно низкого уровня. В сборке x86 есть две инструкции SSE:

MOVDQA xmmi, m128

а также

MOVNTDQA xmmi, m128

В Руководстве разработчика программного обеспечения IA-32 говорится, что NT в MOVNTDQA означает Non-Temporal, и что в остальном это то же самое, что и MOVDQA.

У меня вопрос: что означает Non-Temporal?


person Nathan Fellman    schedule 31.08.2008    source источник
comment
Обратите внимание, что SSE4.1 MOVNTDQA xmmi, m128 является загрузкой NT, в то время как все другие инструкции NT являются сохранением, за исключением prefetchnta. В принятом здесь ответе, похоже, говорится только о магазинах. Это то, что мне удалось превратить около NT нагрузок. TL: DR: надеюсь, ЦП делает что-то полезное с подсказкой NT, чтобы минимизировать загрязнение кеша, но они не отменяют строго упорядоченную семантику нормальной памяти WB, поэтому они должны использовать кеш.   -  person Peter Cordes    schedule 23.11.2016
comment
Обновление: NT load может не делать ничего полезного, кроме областей памяти UCSW на большинстве процессоров (например, в семействе Intel SnB). Хотя NT / streaming store определенно работает с обычной памятью.   -  person Peter Cordes    schedule 08.07.2017
comment
@ Питер: Вы имеете в виду память USWC, верно? Я никогда раньше не слышал о памяти UCSW или USWC. Поиск неправильного акронима в Google не помог :-)   -  person Andrew Bainbridge    schedule 15.08.2017
comment
@AndrewBainbridge: Да, атрибут типа памяти WC. Некэшируемая спекулятивная запись-объединение. Думаю, я использовал UnCacheable с заглавной буквы и помнил, что он должен состоять из 4 букв. :П   -  person Peter Cordes    schedule 26.02.2019


Ответы (3)


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

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

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

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

person Espo    schedule 31.08.2008
comment
Хороший ответ, я просто хотел бы указать, что на типе процессора с инструкциями NT, даже с невременной инструкцией (то есть обычной инструкцией), кеш строк не читается, а затем изменяется. Для обычной записи инструкции в строку, которой нет в кэше, строка резервируется в кэше, а маска указывает, какие части строки являются актуальными. На этой веб-странице говорится, что в магазине нет киоска: ptlsim.org/Documentation/html/node30.html. Я не смог найти более точных ссылок, я слышал об этом только от парней, чья работа заключается в реализации симуляторов процессоров. - person Pascal Cuoq; 05.05.2010
comment
На самом деле ptlsim.org - это веб-сайт, посвященный симулятору процессора с точностью до цикла, точно так же, как и ребята, которые сказали мне, что в магазине нет ларька, делают. Я бы лучше упомянул и их, если они когда-нибудь увидят этот комментарий: unisim.org - person Pascal Cuoq; 05.05.2010
comment
Из ответов и комментариев здесь stackoverflow.com/questions/44864033/ кажется, SFENCE может не понадобиться. По крайней мере, в той же ветке. Не могли бы вы также посмотреть? - person Serge Rogatch; 02.07.2017
comment
@SergeRogatch, это зависит от того, о каком сценарии вы говорите, но да, есть сценарии, в которых sfence требуется для хранилищ NT, тогда как он никогда не требуется только для обычных хранилищ. Хранилища NT не упорядочены по отношению к другим хранилищам (NT или нет), как их видят другие потоки, без sfence. Однако для чтения из того же потока, что и хранилища, вам никогда не понадобится sfence: данный поток всегда будет видеть свои собственные хранилища в программном порядке, независимо от того, являются ли они хранилищами NT или нет. - person BeeOnRope; 08.11.2018
comment
Therefore non-temporal stores must be followed by an SFENCE instruction in order for their results to be seen by other processors in a timely fashion. Я не знаю почему non-temporal stores must be followed by an SFENCE. Тогда non-temporal stores не позволяет переупорядочивать память? - person SungJinKang; 11.06.2021

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

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

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

person Pramod    schedule 01.09.2008
comment
вопрос о вручную написанной сборке, использующей инструкции управления кешем. Я знаю, что вы прямо сказали, что код JavaVM написан вручную. Это лучший вариант использования? JavaVM / Compiler проанализировал статическое и динамическое поведение программы и использует эти невременные инструкции. - person Pat; 01.12.2015
comment
Не следует избегать использования известных свойств местности (или их отсутствия) вашей проблемной области, алгоритма или приложения. Предотвращение загрязнения кеша - действительно очень привлекательная и эффективная задача оптимизации. Кроме того, почему отвращение к сборке? Существует огромное количество возможностей для получения прибыли, которые компилятор не может использовать. - person awdz9nld; 22.12.2015
comment
Определенно верно, что знающий программист низкого уровня может превзойти компилятор для небольших ядер. Это отлично подходит для публикации статей и сообщений в блогах, и я сделал и то, и другое. Они также являются хорошими дидактическими инструментами и помогают понять, что на самом деле происходит. По моему опыту, на практике, когда у вас есть реальная система, над которой работает много программистов, а правильность и ремонтопригодность важны, преимущества низкоуровневого кодирования почти всегда перевешиваются рисками. - person Pramod; 23.12.2015
comment
@Pramod тот же аргумент легко обобщается на оптимизацию в целом и на самом деле не входит в рамки обсуждения - очевидно, что компромисс уже рассматривался или иным образом считался неуместным, учитывая тот факт, что мы уже говорим о невременных инструкциях - person awdz9nld; 31.10.2016

Согласно Руководству разработчика программного обеспечения для архитектур Intel® 64 и IA-32, Том 1: Базовая архитектура, программирование с помощью Intel Streaming SIMD Extensions (Intel SSE), глава:

Кеширование временных и вневременных данных

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

Описание невременных инструкций по загрузке и хранению. Источник: Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, Том 2: Справочник по набору инструкций.

LOAD (MOVNTDQA - Load Double Quadword Non-Temporal Aligned Hint)

Загружает двойное четверное слово из исходного операнда (второго операнда) в целевой операнд (первый операнд) с использованием невременной подсказки, если источником памяти является тип памяти WC (объединение записи) [...]

[...] процессор не считывает данные в иерархию кеша и не извлекает соответствующую строку кеша из памяти в иерархию кеша.

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

СОХРАНИТЬ (MOVNTDQ - сохранять упакованные целые числа с помощью вневременной подсказки)

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

[...] процессор не записывает данные в иерархию кеша и не извлекает соответствующую строку кэша из памяти в иерархию кеша.

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

Наконец, может быть интересно просмотреть Джон Макалпин отмечает о вневременных хранилищах.

person chus    schedule 07.11.2018
comment
SSE4.1 MOVNTDQA делает что-то особенное только с областями памяти WC (некэшируемая запись-объединение), например видео RAM. Это совершенно бесполезно для обычной памяти WB (с обратной записью) на текущем HW, подсказка NT игнорируется и применяется полная строго упорядоченная семантика загрузки. prefetchnta, тем не менее, может быть полезен в качестве уменьшения нагрузки на WB-память. Поддерживают ли текущие архитектуры x86 невременные нагрузки (из обычной памяти)?. - person Peter Cordes; 08.11.2018
comment
Это верно, NT-хранилища отлично работают с WB-памятью, слабо упорядочены и обычно являются хорошим выбором для записи больших областей памяти. Но NT-нагрузки - нет. Руководство по x86 на бумаге позволяет подсказке NT делать что-то при загрузке из памяти WB, но в текущих процессорах она ничего не делает. (Вероятно, потому, что нет аппаратных программ предварительной выборки, поддерживающих NT.) - person Peter Cordes; 08.11.2018
comment
Я добавил соответствующую информацию к ответу. Большое тебе спасибо. - person chus; 08.11.2018
comment
@PeterCordes, поэтому я предполагаю, что использование невременного хранилища в памяти WB имеет только преимущество слабого упорядочения и не отменяет WB, чтобы он вел себя как память WC чего-либо. Но каковы на самом деле преимущества слабо упорядоченных хранилищ в памяти WB, не могли бы вы придумать конкретный сценарий? - person Lewis Kelsey; 25.05.2019
comment
@LewisKelsey: NT store действительно переопределяет тип памяти. Поэтому они могут быть слабо упорядочены по памяти WB. Основным эффектом является предотвращение RFO (очевидно, они отправляют недействительное сообщение, которое даже очищает другие грязные строки, когда они достигают mem). Они также могут стать видимыми вне очереди, поэтому им не нужно ждать, пока не будет зафиксировано предыдущее (обычное) хранилище с ошибкой кэша или пока не будут получены данные при более раннем промахе кэша load. то есть тип узкого места, о котором спрашивается в Всегда ли память вне каждого ядра концептуально плоская / однородная / синхронная в многопроцессорной системе?. - person Peter Cordes; 25.05.2019
comment
@PeterCordes, знаете ли вы, что невременная подсказка также делает записи UC и WP слабо упорядоченными в буфере хранилища? (несмотря на то, что UC и WP переопределяют подсказку с точки зрения кеширования) - person Lewis Kelsey; 13.05.2020
comment
@LewisKelsey: В других случаях, таких как monvtdqa load, переопределение типа памяти означает, что он все еще строго упорядочен. Поэтому я думаю, что тот факт, что UC и WP переопределяют подсказку NT, полностью означает строгий порядок. - person Peter Cordes; 13.05.2020
comment
@PeterCordes: да, я видел это, и я прочитал эту часть руководства, но я не уверен в том, что WP и UC все еще слабо упорядочены планировщиком памяти (потому что он не знает политика кеширования на этом этапе? Я предполагаю, что это только знание кеша L1d, который выполняет поиск TLB после того, как он был отправлен в кеш L1d планировщиком памяти. Я не знаю полных деталей этого взаимодействия). Однако кеш L1d будет читать и игнорировать подсказку из буфера хранилища, рассматривая ее как WP или UC, а не USWC, как говорится в руководстве. - person Lewis Kelsey; 13.05.2020
comment
@LewisKelsey: Очистка машины упорядочивания памяти может убить любые нагрузки из хранилища UC, что не должно было быть сделано раньше, если это необходимо. Помимо этого, порядок фиксации не вступает в силу до тех пор, пока магазин не перестанет работать с вышедшей из строя серверной частью. Это не может произойти до тех пор, пока не будет выполнен uop адреса хранилища, после чего можно проверить тип памяти для адреса. Uop с адресом хранилища проверяет TLB при выполнении; именно так процессоры могут обнаруживать неисправные хранилища до их выхода из эксплуатации. Он не может дождаться, пока запись SB будет готова к фиксации в L1d; в этот момент исполнение уже прошло. - person Peter Cordes; 13.05.2020
comment
@PeterCordes да, тогда как привилегии для нагрузки возвращаются и проверяются при выходе на пенсию, следовательно, расплавление, потому что привилегированная нагрузка может быть спекулятивной, и вы хотите вызвать исключение, только если оно не спекулятивно, потому что тогда никогда не должно быть такой вещи, как отмена микропрограмма исключения или любые подобные накладные расходы - person Lewis Kelsey; 02.06.2020