Разница между инструкциями PREFETCH и PREFETCHNTA - PullRequest
0 голосов
/ 13 ноября 2018

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

Так что же делает PREFETCHNTA, что отличается от инструкции PREFETCH?

1 Ответ

0 голосов
/ 13 ноября 2018

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 бесполезен.

...