Будет ли CPUID сериализовать спекулятивное кэширование данных?

Я нашел описание процедуры спекулятивного кэширования данных из нескольких записей инструкций в Intel Vol.2.

Например, lfence:

Процессоры могут произвольно извлекать и кэшировать данные из областей системной памяти, которые используют типы памяти WB, WC и WT. Эта спекулятивная выборка может произойти в любое время и не связана с выполнением инструкции. Таким образом, он не упорядочен относительно выполнения инструкции LFENCE; данные могут быть внесены в кеши предположительно непосредственно перед, во время или после выполнения инструкции LFENCE.

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

Я хочу знать, предотвратит ли самая сильная инструкция сериализации CPUID спекулятивное кэширование через барьер.

Я уже искал запись CPUID в Intel Vol.2 и раздел "инструкции сериализации" в Intel Vol.3. Но это ничего не говорит о спекулятивном кэшировании данных.


person user10865622    schedule 15.01.2019    source источник


Ответы (1)


LFENCE уже достаточно силен (по крайней мере, на практике), чтобы помешать ЦП фактически просматривать инструкции загрузки после него, но ЦП может спекулятивно загружаться по другим причинам.

Чтобы остановить это, потребовалось бы какое-то предвидение, минуя барьер, чтобы выяснить, для каких адресов отключить предварительную выборку HW. Это совсем не практично. CPUID или другие инструкции сериализации не сильнее LFENCE для остановки предварительной загрузки.

ЦП всегда разрешено спекулятивно производить выборку из памяти в областях / страницах WB и WT. В руководстве по оптимизации Intel задокументированы некоторые сведения об аппаратных средствах предварительной выборки в некоторых из их моделей ЦП, поэтому на практике вы можете избежать действий перед CPUID, которые могут вызвать такую ​​предварительную выборку.

(WC - это слабо упорядоченный некэшируемый + объединение записи, но спекулятивная выборка также разрешена на бумаге. В реальной жизни это, вероятно, происходит только в тени неверного предсказания ветвления, а не предварительной выборки HW. Обычно он не кэшируется, как WB и WT. )


Если вы проводите микробенчмаркинг для реального ЦП, хитрость некоторых видов микробенчмарков заключается в том, чтобы найти шаблон доступа, который не запускает предварительную выборку HW, или отключить предварительные выборки HW.


Возможно, теоретически у вас может быть процессор x86, который смотрит вперед в потоке инструкций для инструкций загрузки / сохранения и предположительно предварительно выбирает их, отдельно от их фактического выполнения (что, согласно определению Intel LFENCE, заблокировало бы). Я не думаю, что что-то помешает ему сделать это и с CPUID.

Такой ЦП, наверное, никто не будет проектировать, потому что

  1. Не стоит транзисторов / питания. Запуск предварительной выборки, как только может появиться регулярное выполнение вне очереди, уже достаточно хорошо. И за исключением абсолютных / относительных адресов RIP или прямых переходов, вам потребуются значения регистров из ядра OoO, чтобы получить полезный адрес предварительной выборки.
  2. Смотреть дальше LFENCE / CPUID - извращенно; они настолько редки, что победа над спекулятивным «казнью» множества мин - это часть дела в эпоху Spectre.
person Peter Cordes    schedule 15.01.2019
comment
Поразмыслив над этим, я думаю, что предварительная выборка HW - это своего рода независимое устройство, работающее параллельно с потоком инструкций. Последовательность инструкций дает подсказку, затем модуль предварительной выборки извлекает данные для кеширования независимо. Я прав? - person user10865622; 15.01.2019
comment
В моей ментальной модели lfence является скорее ограничением инструкций, чем ограничением нагрузки, поэтому я сравниваю его с cpuid и нахожу отсутствие процитированного абзаца в cpuid любопытным. Возможно, цель этого параграфа - обратиться к части этой инструкции, касающейся ограничения загрузки, потому что загрузка в кеш - это своего рода загрузка. Следовательно, этот абзац не включен в cpuid. - person user10865622; 15.01.2019
comment
@ user10865622: да, и общие кеши (общие для нескольких ядер) тоже могут иметь предварительные выборки. Я забываю, есть ли у процессоров Intel или AMD предварительная выборка L3. Большая часть логики PF находится в частном L2 на ядро ​​Intel, а часть - в L1d и L1i. Что касается того, почему CPUID не имеет похожего языка, да, вероятно, потому, что название инструкции подразумевает упорядочение памяти. (Но да, это почти бесполезно для упорядочивания памяти, только для упорядочивания инструкций. Единственный вариант использования порядка памяти для lfence - это, я думаю, упорядочивание загрузок NT из памяти WC: в качестве барьера LoadLoad и LoadStore, но не StoreLoad.) - person Peter Cordes; 15.01.2019
comment
Правильно, все устройства предварительной выборки данных выполняют предварительную выборку только из местоположений WB (даже не из WT). См. Раздел 2.4.5.4 руководства по оптимизации: Загрузка выполняется из памяти с обратной записью. В дополнение к тому факту, что устройства предварительной выборки не пересекают границы страниц размером 4 КБ и что типы памяти указаны на страницу. - person Hadi Brais; 10.07.2019