Clflush также удаляет записи TLB?

Нет лучшего решения; однако я хотел бы утверждать, что двойные кавычки могут быть более желательными время от времени:

  • Новички уже будут знакомы с двойными кавычками с их языка. На английском языке мы должны использовать двойные кавычки ", чтобы идентифицировать прохождение цитируемого текста. Если бы мы использовали одну цитату ', читатель мог бы неправильно истолковать ее как сокращение. Другой смысл прохода текста, окруженного ', указывает на «разговорное» значение. Имеет смысл придерживаться уже существующих языков, и это, вероятно, облегчит изучение и интерпретацию кода.
  • Двойные кавычки устраняют необходимость избегать апострофов (как в схватках). Рассмотрим строку: "I'm going to the mall" по сравнению с иначе экранированной версией: 'I\'m going to the mall'.
  • Двойные кавычки означают строку на многих других языках. Когда вы изучаете новый язык, такой как Java или C, всегда используются двойные кавычки. В Ruby, PHP и Perl строки с одним кавычком подразумевают отсутствие обратных слэшей, а двойные кавычки поддерживают их.
  • Обозначение JSON записывается с двойными кавычками.

Тем не менее, как утверждали другие, наиболее важно оставаться последовательным.

2
задан Peter Cordes 16 January 2019 в 10:45
поделиться

2 ответа

Событие производительности dTLB-loads-misses:u может использоваться для определения, сбрасывает ли clflush запись TLB, которая отображает указанную строку кэша. Это событие происходит, когда загрузка пропускает все уровни TLB и вызывает просмотр страницы. Это также более широко поддерживается по сравнению с dTLB-stores-misses:u. В частности, dTLB-loads-misses:u поддерживается на Intel P4 и более поздних версиях (кроме Goldmont) и на AMD K7 и более поздних версиях.

Код можно найти по адресу https://godbolt.org/z/97XkkF . Он принимает два параметра:

  • argv[1], который указывает, должны ли быть сброшены все строки указанной страницы 4 КБ или только одна строка кэша.
  • argv[2], который определяет, использовать ли clflush или clflushopt.

Тест прост. Он выделяет одну страницу размером 4 КБ и обращается к одному и тому же местоположению большое количество раз, используя инструкцию загрузки. Однако перед каждым доступом выполняется операция очистки кэша, как указано в argv[1] и argv[2]. Если очистка вызвала удаление записи TLB, то произойдет событие dTLB-loads-misses:u. Если количество событий где-то близко к количеству нагрузок, то мы можем заподозрить, что очистка оказала влияние на TLB.

Используйте следующие команды для компиляции и запуска кода:

gcc -mclflushopt -O3 main.c
perf stat -e dTLB-loads-misses:u ./a.out wholePage opt

где wholePage и opt могут быть 0 или 1. Таким образом, есть 4 случая для проверки.

Я провел тест на SNB, IVB, HSW, BDW и CFL. На всех процессорах и во всех случаях количество событий очень незначительно. Вы можете запустить тест на других процессорах.


Мне также удалось запустить тест для WBINVD, вызвав ioctl в цикле модуля ядра для выполнения инструкции в режиме ядра. Я измерил dTLB-loads-misses:u, iTLB-loads-misses:u и icache_64b.iftag_miss:u. Все они очень незначительны (менее 0,004% от 1 миллиона инструкций по загрузке). Это означает, что WBINVD не очищает DTLB, ITLB или кэш команд. Он только сбрасывает кеши данных.

0
ответ дан Hadi Brais 16 January 2019 в 10:45
поделиться
1119 Я думаю, что можно предположить, что нет; выпечка invlpg в clflush звучит как безумное дизайнерское решение, которое, я думаю, никто не примет. Вы часто хотите сделать недействительными несколько строк на странице. Там также нет очевидной выгоды; очистка TLB также не облегчает реализацию очистки кэша данных.

Даже простое удаление окончательной записи TLB (без необходимости аннулирования какого-либо кэширования каталога страниц) будет слабее, чем invlpg, но все равно не имеет смысла.

Все современные x86 используют кеши с физическим индексированием / тегами, а не виртуальные. (Кэши L1d VIPT на самом деле являются PIPT со свободной трансляцией индекса, потому что они взяты из битов адреса, которые являются частью смещения на странице.) И даже если кеши были виртуальными, аннулирование записей TLB требует аннулирования виртуальных кешей, но не наоборот. .


Согласно IACA, clflush составляет только 2 мопа на HSW-SKL и 4 мопа (включая микросинтез) на NHM-IVB. Так что это даже не микрокодирование на Intel.

IACA не моделирует invlpg, но я предполагаю, что это больше мопсов. (И это привилегировано, так что это не совсем тривиально для тестирования.) Удаленно возможно, что эти дополнительные мопы на pre-HSW были для аннулирования TLB.

У меня нет никакой информации о AMD.


Тот факт, что invlpg является привилегированным, является еще одной причиной ожидать, что clflush не будет его надмножеством. clflush непривилегирован. Предположительно, только из соображений производительности invlpg ограничен только кольцом 0.

Но invlpg не будет сбоя страницы, поэтому пользовательское пространство может использовать его для аннулирования записей TLB ядра, задержки процессов в реальном времени и обработчиков прерываний. (wbinvd является привилегированным по аналогичным причинам: он очень медленный, и я думаю, что он не прерываемый.) clflush совершает ошибку на недопустимых адресах, поэтому он не откроет эту уязвимость отказа в обслуживании. Вы могли бы clflush совместно использовать страницу VDSO.

Если только по какой-то причине процессор не хочет, чтобы выставлял invlpg в пространстве пользователя (переводя его в clflush), я действительно не понимаю, почему какой-либо поставщик сделал бы это .


С энергонезависимыми модулями DIMM в будущем вычислений, еще менее вероятно, что любые будущие процессоры будут делать слишком медленные циклы для работы с диапазоном памяти clflush. Вы ожидаете, что большинство программ, использующих NV-хранилище с отображением памяти, будет использовать clflushopt, но я бы ожидал, что производители процессоров также сделают clflush максимально быстрым.

0
ответ дан Peter Cordes 16 January 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: