Что вызывает события производительности DTLB_LOAD_MISSES.WALK_ *? - PullRequest
0 голосов
/ 30 сентября 2018

Рассмотрим следующий цикл:

.loop:
    add     rsi, STRIDE    
    mov     eax, dword [rsi]
    dec     ebp
    jg .loop

, где STRIDE - некоторое неотрицательное целое число, а rsi содержит указатель на буфер, определенный в разделе bss.Этот цикл является единственным циклом в коде.То есть он не инициализируется и не затрагивается до цикла.В Linux все виртуальные страницы 4K буфера будут отображаться по требованию на одну и ту же физическую страницу.

Я запустил этот код для всех возможных шагов в диапазоне 0-8192.Измеренное количество мелких и главных сбоев страницы составляет ровно 1 и 0, соответственно, на страницу, к которой осуществляется доступ.Я также измерил все следующие события производительности на Haswell для всех шагов в этом диапазоне.

DTLB_LOAD_MISSES.MISS_CAUSES_A_WALK : промахи во всехУровни TLB, вызывающие обход страниц любого размера.

DTLB_LOAD_MISSES.WALK_COMPLETED_4K : Завершение обхода страниц из-за пропусков загрузки по требованию, из-за которых при просмотре страниц 4K на любых уровнях TLB возникали обходы страниц 4K.

DTLB_LOAD_MISSES.WALK_COMPLETED_2M_4M : завершенные обходы страниц из-за пропаданий нагрузки по требованию, которые вызывали обходы страниц 2M / 4M на любых уровнях TLB.

DTLB_LOAD_MISSES.WET_M1SG_LEG_C:на всех уровнях TLB вызывает просмотр страницы, который завершается.(1G).

DTLB_LOAD_MISSES.WALK_COMPLETED : завершенные обходы страниц в любом TLB любого размера страницы из-за пропусков загрузки по требованию

Два счетчика дляВсе огромные страницы равны нулю.Другие три счетчика интересны, как показано на следующем графике.

enter image description here

Для большинства шагов событие MISS_CAUSES_A_WALK происходит 5 раз на страницу, к которой осуществляется доступ, иWALK_COMPLETED_4K и WALK_COMPLETED события происходят каждый раз 4 раза на страницу, к которой обращаются.Это означает, что все пройденные страницы предназначены для страниц 4K.Тем не менее, есть пятая страница, которая не завершена.Почему на странице так много страниц?Что вызывает эти прогулки по страницам?Возможно, когда при просмотре страницы происходит сбой страницы, после обработки ошибки будет еще один просмотр страницы, так что это может быть засчитано как два завершенных просмотра страницы.Но как получилось, что 4 полных обхода страницы и один явно отмененный обход? Обратите внимание, что на Haswell есть один обходчик страниц (по сравнению с двумя на Broadwell).

Я понимаю, что естьУстройство предварительной выборки TLB, которое, по-видимому, способно выполнить предварительную выборку только на следующей странице, как описано в этой теме .Согласно этой ветке, обходы предварительной выборки, по-видимому, не считаются событиями MISS_CAUSES_A_WALK или WALK_COMPLETED_4K, с чем я согласен.

По-видимому, это две причины для такого большого количества событий:(1) сбой страницы приводит к повторному выполнению инструкции, что вызывает второй просмотр страницы для одной и той же страницы, и (2) множественные одновременные обращения, которые отсутствуют в TLB. В противном случае, выделяя память с MAP_POPULATE и добавление инструкции LFENCE после инструкции загрузки, происходит одно MISS_CAUSES_A_WALK событие и одно WALK_COMPLETED_4K событие на страницу .Без LFENCE количество страниц на странице немного больше.

Я пробовал, чтобы каждая загрузка обращалась к неверному месту в памяти.В этом случае обработчик ошибок страницы генерирует сигнал SIGSEGV, который я обрабатываю, чтобы позволить программе продолжить выполнение.С помощью инструкции LFENCE я получаю два MISS_CAUSES_A_WALK события и два WALK_COMPLETED_4K события для доступа .Без LFENCE число запросов на доступ немного больше.

Я также пытался использовать инструкцию предварительной выборки вместо загрузки по требованию в цикле.Результаты для случая сбоя страницы совпадают с регистром недопустимого расположения в памяти (что имеет смысл, поскольку в обоих случаях сбой предварительной выборки): одно событие MISS_CAUSES_A_WALK и одно событие WALK_COMPLETED_4K на каждую предварительную выборку .В противном случае, если предварительная выборка находится в местоположении с допустимым переводом в памяти, происходит одно событие MISS_CAUSES_A_WALK и одно событие WALK_COMPLETED_4K на страницу .Без LFENCE количество страниц на странице немного больше.

Все эксперименты проводились на одном и том же ядре.Количество прерываний TLB на этом ядре практически равно нулю, поэтому они не влияют на результаты.Я не смог найти простой способ измерить количество выселений TLB в ядре ОС, но я не думаю, что это важный фактор.


Spike

Также, как показано на графике выше, есть специальный шаблон для маленьких шагов.Кроме того, вокруг шага 220 есть очень странный паттерн (шип). Мне удалось воспроизвести эти паттерны много раз.Следующий график увеличивает этот странный паттерн, чтобы вы могли его ясно видеть.Я думаю, что причиной этого шаблона является активность ОС, а не то, как работают события производительности или какой-то микроархитектурный эффект, но я не уверен.

enter image description here


Влияние развертки цикла

@ BeeOnRope предложил поместить LFENCE в цикл и развернуть его ноль или более раз, чтобы лучше понять эффект спекулятивного, вневыполнение заказа по событию имеет значение.Следующие графики показывают результаты.Каждая строка представляет определенный шаг загрузки, когда цикл развернут 0-63 раза (1-64 пары команд добавления / загрузки в одной итерации).Ось Y нормализована для каждой страницы.Количество просмотренных страниц совпадает с количеством незначительных сбоев страниц.

enter image description here

enter image description here

Я также проводил эксперименты без LFENCE, но с разными степенями раскрутки.Я не сделал графики для них, но я расскажу об основных различиях ниже.

Мы можем сделать следующие выводы:

  • Когда шаг загрузки составляет менее 128байты, MISS_CAUSES_A_WALK и WALK_COMPLETED_4K демонстрируют большую вариацию в разных степенях развертывания.Большие шаги имеют плавные кривые, где MISS_CAUSES_A_WALK сходится к 3 или 5, а WALK_COMPLETED_4K сходится к 3 или 4.
  • LFENCE, кажется, имеет значение только тогда, когда степень разворачивания равна нулю (т.е.одна загрузка на итерацию).Без LFENCE результаты (как обсуждалось выше) составляют 5 MISS_CAUSES_A_WALK и 4 WALK_COMPLETED_4K событий на страницу.С LFENCE они оба становятся 3 на страницу.Для больших степеней развертывания число событий в среднем постепенно увеличивается.Когда степень развертывания составляет, по меньшей мере, 1 (то есть, по меньшей мере, две загрузки на итерацию), LFENCE по существу не имеет значения.Это означает, что два новых графика графиков выше одинаковы для случая без LFENCE, за исключением случаев, когда на одну итерацию приходится одна загрузка.Кстати, странный всплеск возникает только тогда, когда степень развертывания равна нулю, а LFENCE.
  • вообще отсутствует. В общем, развертывание цикла уменьшает количество инициированных и завершенных прогулок, особенно когда степень развертывания равнамаленький, независимо от того, какова нагрузка.Без развертывания можно использовать LFENCE, чтобы получить тот же эффект.При развертывании нет необходимости использовать LFENCE.В любом случае время выполнения с LFENCE намного выше.Поэтому использование его для сокращения просмотра страниц значительно снизит производительность, а не улучшит ее.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...