Clflush также удаляет записи TLB? - PullRequest
0 голосов
/ 15 января 2019

Обрабатывает ли clflush 1 также связанные записи TLB? Я бы предположил, что нет, поскольку clflush работает с гранулярностью строки кэша, в то время как записи TLB существуют с (гораздо большей) гранулярностью страницы - но я готов удивляться.


1 ... или clflushopt, хотя можно разумно предположить, что их поведение одинаково.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Событие производительности 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 голосов
/ 16 января 2019

Я думаю, можно предположить, что нет; выпечка invlpg в clflush звучит как безумное дизайнерское решение, которое, я думаю, никто не примет. Вы часто хотите сделать недействительными несколько строк на странице. Там также нет очевидной выгоды; очистка TLB также не облегчает реализацию очистки кэша данных.

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

Все современные x86 используют кеши с физическим индексированием / тегами, а не виртуальные. (Кэши VIPT L1d на самом деле являются 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 максимально быстрым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...