Можем ли мы использовать невременные инструкции mov в памяти кучи? - PullRequest
1 голос
/ 24 марта 2020

В статье Агнера Фога «Оптимизация подпрограмм на языке ассемблера - раздел 11.8 Инструкции по управлению кэшем», - говорит он: «Операции записи в память обходятся дороже, чем чтение, когда в кэше с обратной записью происходят пропадания. Необходимо прочитать всю строку кэша. из памяти, модифицированные и записанные обратно в случае пропадания кэша. Этого можно избежать, используя не временные инструкции записи MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPD, MOVNTPS . Эти инструкции следует использовать при записи в область памяти, которая вряд ли будет кэширована и вряд ли будет считана из нее еще до того, как будет удалена потенциальная строка кэша. Как правило, рекомендуется рекомендовать использовать не временные записи только при записи блока памяти, который больше половины размера самого большого кеша. "

Из "Руководства разработчика программного обеспечения для архитектуры Intel 64 и IA-32, объединенные тома, октябрь 2019 г." - "Эти инструкции для временных хранилищ SSE и SSE2 сводят к минимуму загрязнение кэша, обрабатывая доступ к памяти как объединение при записи (W C) тип. Если программа указывает невременное хранилище с помощью одной из этих инструкций и типом памяти области назначения является запись с обратной записью (WB), запись с помощью (WT) или объединение записи (W *) 1015 *), процессор будет делать следующее ... "

Я думал, что объединяющая запись память встречается только в графических картах, но не в кучной памяти общего назначения - и, соответственно, инструкции, перечисленные выше, будут полезны только в таких случаях. Если это правда, почему Агнер Фог рекомендует эти инструкции? Руководство Intel, похоже, предполагает, что оно полезно только с памятью WB, WT или W C, но затем говорят, что доступ к памяти будет рассматриваться как W C.

Если эти инструкции действительно можно использовать в обычной записи в кучную память, есть ли какие-либо ограничения? Как выделить память, сочетающую запись?

1 Ответ

3 голосов
/ 25 марта 2020

Вы можете использовать хранилища NT, такие как movntps, в обычной памяти ББ (т. Е. В куче). См. Также Расширенный REP MOVSB ​​для memcpy для получения дополнительной информации о хранилищах NT и обычных хранилищах. .

Он рассматривает его как W C для целей этих хранилищ NT, несмотря на то, что для MTRR и / или PAT установлено нормальное значение WB.

Документы Intel говорят вам, что хранилища NT "работают" в WB, WT и W C память . (Но не строго упорядоченная не кешируемая память U C и, конечно, не в памяти WP, защищенной от записи).


Вы правы, что обычно только видеопамять (или, возможно, другое подобное устройство памяти) области) отображаются W C. И нет, вы не можете легко выделить W C память в процессе пользовательского пространства под обычной ОС, такой как Linux, но вы обычно не захотите.

Вы можете использовать только SSE4 NT загружает память W C (в противном случае современные процессоры игнорируют подсказку NT), но некоторое загрязнение кэша для нагрузок - это небольшая цена за предварительную выборку HW и работу кэширования. Вы можете использовать NT prefetch из памяти WB до , чтобы уменьшить загрязнение на некоторых уровнях кэша, например, минуя L2. Но это трудно настроить.

IIR C, нормальные хранилища, такие как mov в памяти W C, имеют поведение слияния хранилищ, которое вы получаете из хранилищ NT. Но для работы хранилищ NT вам не нужно использовать память W C.

...