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

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

MOVDQA xmmi, m128

и

MOVNTDQA xmmi, m128

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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