Nextrp [CPP] RU + Many GEOs Игра на карте России | NEXTRP

В чем смысл «не временных» обращений к памяти в x86

x86 sse assembly

25370 просмотра

3 ответа

59452 Репутация автора

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

MOVDQA <i><em>xmmi, m128</em></i>

а также

MOVNTDQA <i><em>xmmi, m128</em></i>

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

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

Автор: Nathan Fellman Источник Размещён: 31.08.2008 08:18

Ответы (3)


115 плюса

33813 Репутация автора

Решение

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

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

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

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

Автор: Espo Размещён: 31.08.2008 08:50

32 плюса

6717 Репутация автора

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

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

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

Автор: Pramod Размещён: 01.09.2008 04:03

0 плюса

940 Репутация автора

В соответствии с Руководством разработчика программного обеспечения Intel® 64 и IA-32, том 1: базовая архитектура, «Программирование с потоками Intel SIMD Extensions (Intel SSE)»:

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

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

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

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

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

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

МАГАЗИН (MOVNTDQ-Хранить пакетные целые числа с использованием невременного подсказки)

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

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

Используя терминологию, определенную в Политике и производительности кэширования , их можно рассматривать как запись (no-write-allocate, no-fetch-on-write-miss).

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

Автор: chus Размещён: 07.11.2018 11:59
32x32