В чем смысл "невременных" обращений к памяти в x86
это несколько низкоуровневый вопрос. В сборке x86 есть две инструкции SSE:
MOVDQA xmmi, m128
и
MOVNTDQA xmmi, m128
в руководстве разработчика программного обеспечения IA-32 говорится, что NT в MOVNTDQA означает Невременные, и что в противном случае это то же самое, что и MOVDQA.
мой вопрос в том, что делает Невременные в смысле?
2 ответа:
Невременные инструкции SSE (MOVNTI, MOVNTQ и др.), не следуйте обычным правилам согласованности кэша. Поэтому за невременными хранилищами должна следовать инструкция SFENCE для того, чтобы их результаты были своевременно замечены другими процессорами.
когда данные создаются и не (немедленно) потребляются снова, тот факт, что операции хранилища памяти сначала считывают полную строку кэша, а затем изменяют кэшированные данные, наносит ущерб производительности. Эта операция выталкивает данные из кэшей, которые могут понадобиться снова в пользу данных, которые не будут использоваться в ближайшее время. Это особенно верно для больших структур данных, таких как матрицы, которые заполняются и затем используются позже. Перед заполнением последнего элемента матрицы сам размер вытесняет первые элементы, что делает кэширование записей неэффективным.
для этой и подобных ситуаций процессоры обеспечивают поддержку операций записи без времени. Невременные в этом контексте означает, что данные не будут только повторно использовать, так что нет никаких причин, чтобы кэшировать его. Эти невременные операции записи не считывают строку кэша и не изменяют ее; вместо этого новое содержимое записывается непосредственно в память.
Источник:http://lwn.net/Articles/255364/
ВСТО в значительной степени удар по цели. Просто хотел добавить мои два цента:
фраза "не временная" означает отсутствие временной локализации. Кэш использует два вида локальности-пространственную и временную, и с помощью невременной инструкции вы сигнализируете процессору, что вы не ожидаете, что элемент данных будет использоваться в ближайшем будущем.
Я немного скептически отношусь к сборке с ручным кодом, которая использует инструкции по управлению кэшем. По моему опыту эти вещи приведите к более злым ошибкам, чем любое эффективное повышение производительности.