Что означает "не временные" обращения к памяти в x86 - PullRequest
106 голосов
/ 01 сентября 2008

Это вопрос несколько низкого уровня. В сборке 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 ?

Ответы [ 3 ]

131 голосов
/ 01 сентября 2008

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

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

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

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

35 голосов
/ 01 сентября 2008

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

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

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

3 голосов
/ 08 ноября 2018

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

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

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

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

ЗАГРУЗИТЬ (MOVNTDQA - загрузить подсказку о невременном выравнивании двойного слова)

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

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

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

STORE (MOVNTDQ - хранить упакованные целые числа с использованием невременного намека)

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

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

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

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

...