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

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

MOVDQA xmmi, m128

а также

MOVNTDQA xmmi, m128

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

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

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

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

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

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

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

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

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

  • Прямой просмотр программы
  • Как работает $ в NASM?
  • Оптимизация для быстрого умножения, но медленное добавление: FMA и doubleedouble
  • Что такое инструкции IN & OUT для x86?
  • Какова цель XORing регистрации с собой?
  • Заказ локального распределения переменных в стеке
  • `testl` eax против eax?
  • Возможно ли, чтобы процессор x86 соответствовал процессору ARM с точки зрения производительности на ватт?
  • Каков наилучший способ установить регистр в ноль в сборке x86: xor, mov или или?
  • Почему нарушение «выходной зависимости» LZCNT имеет значение?
  • Почему вы не можете установить указатель инструкции напрямую?
  • Давайте будем гением компьютера.