prefetchNTA не может обходить кэши, а только уменьшать (но не избегать) загрязнение. Он не может нарушить когерентность кэша или нарушить семантику упорядочения памяти в области памяти WB (обратная запись). (В отличие от хранилищ NT, которые полностью обходят кэши и слабо упорядочены даже в обычной памяти WB.)
На бумаге x86 ISA не указывает, как реализовать подсказку NT. http://felixcloutier.com/x86/PREFETCHh.html говорит: NTA ( невременные данные по отношению ко всем уровням кеша) — предварительная выборка данных в структуру невременного кеша и в местоположение, близкое к процессору, сводя к минимуму загрязнение кеша. То, как конкретная микроархитектура ЦП решит реализовать это, полностью зависит от архитекторы.
prefetchNTA
из памяти WB1 на процессорах 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 (Line Fill Buffer), что позволяет SSE4.1 movntdqa
загружать уже заполненный LFB. (movntdqa
загружается из памяти WC по словам Intel, действительно работают, загружая данные в LFB. Вот как несколько movntdqa
загрузок в одну и ту же строку кэша могут избежать нескольких фактических операций чтения DRAM или транзакций PCIe). См. также Невременные нагрузки и аппаратный предварительный выбор , они работают вместе? - нет, не аппаратная предварительная выборка.
Но учтите, что movntdqa
из памяти ББ не пригодится. Он просто работает как обычная нагрузка (плюс по какой-то причине ALU uop).
person
Peter Cordes
schedule
12.11.2018