prefetchNTA не может обойти кэши, только уменьшить (не избежать) загрязнения.Он не может нарушить когерентность кэша или нарушить семантику упорядочения памяти в области памяти WB (обратная запись).(В отличие от хранилищ NT, которые полностью обходят кэши и слабо упорядочены даже в обычной памяти WB.)
На бумаге ISA x86 не определяет , как реализует подсказку NT,http://felixcloutier.com/x86/PREFETCHh.html говорит: « NTA (невременные данные по всем уровням кэша) - предварительная загрузка данных во временную структуру кэша и в местоположение, близкое к процессору, сводя к минимуму загрязнение кэша. «Как любая конкретная микроархитектура ЦП выбирает реализацию, полностью соответствующую архитекторам.
prefetchNTA
из памяти WB 1 на процессорах Intel заполняет L1d нормально, что позволяет последующим загрузкампопадание в L1d обычно (до тех пор, пока расстояние предварительной выборки достаточно велико, чтобы предварительная выборка была завершена, и достаточно мало, чтобы оно не выселялось снова до загрузки по требованию).Правильное расстояние предварительной выборки зависит от системы и других факторов и может быть довольно хрупким.
То, что он делает на процессорах Intel, - это пропуск не включающих внешних кэшей.Таким образом, на Intel до Skylake-AVX512 он обходит L2 и заполняет L1d + L3.Но на SKX он также полностью пропускает кэш L3, потому что он меньше и не включает.См. Поддерживают ли нынешние архитектуры x86 невременные нагрузки (из «нормальной» памяти)?
На процессорах Intel с включенными кэшами L3 (которые он не может обойти), это уменьшает загрязнение L3ограничившись предварительной выборкой в один «путь» ассоциативного инклюзивного кэша L3.(Обычно это что-то вроде 16-сторонней ассоциации, поэтому общая емкость, которая может быть загрязнена prefetchnta
, составляет всего ~ 1/16 от общего размера L3).
@ HadiBrais прокомментировал этот ответс некоторой информацией о процессорах AMD.
Вместо того, чтобы ограничивать загрязнение путем извлечения только одного способа кэширования, очевидно, AMD выделяет строки, извлеченные с помощью предварительной выборки NT, с пометкой «быстрое исключение».Вероятно, это означает распределение в позиции LRU вместо позиции «Последние использованные».Таким образом, следующее выделение в этом наборе кэша приведет к удалению строки.
Сноска 1: prefetchNTA
из памяти WC. Я думаю, что предварительные выборки в LFB позволяют SSE4.1 movntdqa
загружаться вударил уже заселенный LFB.Но обратите внимание, что movntdqa
из памяти WB бесполезен.