Будет ли CPUID сериализировать спекулятивное кеширование данных?
Я нашел описание спекулятивной процедуры кэширования данных из нескольких записей инструкций в Intel Vol.2.
Например, lfence
:
Процессоры могут произвольно извлекать и кэшировать данные из областей системной памяти, которые используют типы памяти WB, WC и WT. Эта умозрительная выборка может происходить в любое время и не связана с выполнением инструкций. Таким образом, он не упорядочен в отношении выполнения инструкции LFENCE; данные могут быть введены в кэш спекулятивно непосредственно перед, во время или после выполнения инструкции LFENCE.
Кроме того, я обнаружил на онлайн-ресурсах, что спекулятивное кэширование будет перемещать данные из более дальнего кеша в более близкий кеш.
Я хочу знать, является ли самая сильная инструкция сериализации CPUID
предотвратит спекулятивное кеширование через барьер.
Я уже искал CPUID
запись в Intel Vol.2 и раздел "Инструкция по сериализации" в Intel Vol.3. Но это ничего не говорит о спекулятивном кешировании данных.
1 ответ
LFENCE уже достаточно силен (по крайней мере, на практике), чтобы помешать ЦП фактически просматривать инструкции по загрузке после него, но ЦП свободен для умозрительной загрузки по другим причинам.
Остановка для этого потребует какого-то заглянуть за барьер, чтобы выяснить, для каких адресов отключить предварительную выборку HW. Это совсем не практично. CPUID или другие инструкции сериализации ничем не сильнее LFENCE для остановки предварительных загрузок.
Процессору всегда разрешается умозрительно извлекать данные из памяти в областях / страницах WB, WC и WT. Руководство по оптимизации Intel документирует некоторые сведения об аппаратных средствах предварительной выборки в некоторых из их моделей ЦП, поэтому на практике вы можете избежать действий перед CPUID, которые могут вызвать такие предварительные выборки.
Если вы используете микробенчмаркинг реального процессора, то хитрость для некоторых видов микробенчмарков заключается в том, чтобы найти схему доступа, которая не вызовет предварительную выборку HW, или отключить предварительную выборку HW.
Возможно, теоретически у вас мог бы быть процессор x86, который смотрел бы вперед в потоке инструкций для команд загрузки / хранения и умозрительно предварительно выбирал их, отдельно от фактического их выполнения (которое определение LFENCE Intel блокировало бы). Я не думаю, что что-нибудь помешало бы сделать это через CPUID.
Вероятно, никто не будет проектировать такой процессор, потому что
- Это не стоит транзисторов / мощности. Начать предварительную выборку, как только к ней может приступить обычное внеплановое выполнение, уже достаточно хорошо. И кроме абсолютных / RIP-относительных адресов или прямых переходов, вам понадобится зарегистрировать значения из ядра OoO, чтобы получить полезный адрес предварительной выборки.
- Взгляд в прошлое LFENCE / CPUID извращен; они достаточно редки, чтобы победить спекулятивное "выполнение" нагрузок мимо них является частью сути, в эпоху Призрака.