Что может означать resource_stall.other - PullRequest
3 голосов
/ 17 февраля 2020

Whiskey Lake i7-8565U

RESOURCE_STALLS.OTHER не выглядит хорошо объясненным документами Intel:

Подсчитывает количество циклов, в то время как выполнение было остановлено из-за других проблемы с ресурсами.

Я провел эксперименты на примере копии памяти 16MiB случайно сгенерированных данных в al oop, состоящей из 6400 итераций.


Базовый уровень:

avx_memcpy_baseline:
    shr rdx, 0x3
    xor rcx, rcx
avx_memcpy_baseline_loop:
    add rcx, 0x08
    cmp rdx, rcx
    ja avx_memcpy_baseline_loop
    ret

Базовые счетчики:

   823 292 269      resource_stalls.any
       181 045      r02a2 #LOAD
   831 370 403      r04a2 #RS_FULL
        49 659      resource_stalls.sb
       130 100      r10a2 #ROB_FULL
        63 386      r20a2 #FPCW
     2 151 516      r40a2 #MSCXR
         4 222      r80a2 #OTHER  

WB Магазины:

avx_memcpy_forward_llss:
    shr rdx, 0x3
    xor rcx, rcx
avx_memcpy_forward_loop_llss:
    vmovdqa ymm0, [rsi + 8*rcx]
    vmovdqa ymm1, [rsi + 8*rcx + 0x20]
    vmovdqa [rdi + rcx*8], ymm0
    vmovdqa [rdi + rcx*8 + 0x20], ymm1
    add rcx, 0x08
    cmp rdx, rcx
    ja avx_memcpy_forward_loop_llss
    ret

WB Счетчики магазинов:

27 089 245 473      resource_stalls.any
     4 873 836      r02a2  #LOAD                                                                                                                                          
    14 099 696      r04a2  #RS_FULL                                                                                                                                          
24 130 341 296      resource_stalls.sb                                                                                                                                                               
     5 790 969      r10a2  #ROB_FULL                                                                                                                                               
       375 032     r20a2   #FPCW                                                                                                                                                      
     3 395 592      r40a2  #MXCSR
 4 899 892 032      r80a2   #resource_stalls.other 14% of RESOURCE_STALL.ANY

NT Магазины:

avx_nt_memcpy_forward_llss:
    shr rdx, 0x3
    xor rcx, rcx
avx_nt_memcpy_forward_loop_llss:
    vmovdqa ymm0, [rsi + 8*rcx]
    vmovdqa ymm1, [rsi + 8*rcx + 0x20]
    vmovntdq [rdi + rcx*8], ymm0
    vmovntdq [rdi + rcx*8 + 0x20], ymm1
    add rcx, 0x08
    cmp rdx, rcx
    ja avx_nt_memcpy_forward_loop_llss
    ret

NT Stores counters:

18 121 917 993      resource_stalls.any
     2 211 195      r02a2 #LOAD
     5 588 784      r04a2 #RS_FULL
12 061 475 989      resource_stalls.sb
     3 156 129      r10a2 #ROB_FULL
       165 967     r20a2  #FPCW
     2 152 595      r40a2  #MXCSR                                                       
 6 730 668 837      r80a2 #resource_stalls.other 33% of RESOURCE_STALLS.ANY   

Это весьма заметно в случае не временных магазинов, где потребовалось 1/3 всех киосков ресурсов, поэтому мне любопытно узнать, что RESOURCE_STALLS.OTHER может означать при профилировании подпрограмм, связанных с памятью, в Skylake или более поздней версии.

1 Ответ

4 голосов
/ 21 февраля 2020

Корпорация Intel зарегистрировала только два связанных с ресурсами стойла на вашем процессоре, а именно RESOURCE_STALLS.ANY и RESOURCE_STALLS.SB. Другие события описаны на Nehalem / Westmere, но это не значит, что они будут работать точно на Skylake. Вам нужно будет проверить их, прежде чем пытаться понять смысл событий. По крайней мере, мы должны проверить, равна ли RESOURCE_STALLS.ANY сумма RESOURCE_STALLS.SB и других недокументированных событий. Похоже, они действительно складывают. (IIR C, около двух лет go, я был в ситуации, когда мне нужно было проверить некоторые из этих недокументированных событий в Haswell, но я не могу вспомнить, какие именно события, к сожалению.)

Руководство Intel описывает RESOURCE_STALLS.ANY на Skylake следующим образом:

Циклы остановок, связанных с ресурсами. Причины остановок могут быть следующими:
a. любая заполненная структура u-arch (LB, SB, RS, ROB, BOB, LM, слоты таблицы восстановления физических регистров (PRRT) или таблицы физических историй (PHT)).
b. любая структура u-arch пуста (как INT / SIMD FreeLists).
c. Управляющее слово FPU (FPCW), MXCSR.и др.
Считает циклы, которые серверная часть конвейера заблокировала доставку из внешнего интерфейса.

В этом описании представлен неполный список категории связанных с ресурсом киосков, а не указанные c причины остановки. Например, категория RS включает в себя множество причин остановки, которые указываются для c. Они существуют в большинстве микроархитектур Intel, выходящих из строя, но конкретные причины задержки c могут значительно различаться для разных микроархитектур. Относительная важность каждой категории с точки зрения ее влияния на производительность также зависит от микроархитектуры. Эта классификация удобна с точки зрения анализа.

Обратите внимание, что многие из причин остановки, по которым события производительности были задокументированы на старых микроархитектурах, теперь просто упоминаются в RESOURCE_STALLS.ANY, что означает, что они все еще существуют, даже если соответствующие события не задокументированы.

Ниже приведено краткое описание каждой из этих категорий, применимых ко всем вышедшим из строя микроархитектурам:

  • LB: загрузочный буфер содержит загрузочные операции и другие мопы, которые выполняются на загрузочной трубе. В эту категорию входят причины срыва, указанные c для LB. Когда распределитель не может выделить запись LB по какой-либо причине, происходит остановка LB.
  • SB: Буфер хранения содержит STA, STD и другие мопы, которые выполняются в канале хранения. В эту категорию входят причины срыва, указанные c для SB. Когда распределитель не может выделить запись SB по какой-либо причине, происходит останов SB.
  • RS: Содержит все незавершенные мопы. RS может быть распределенным или унифицированным, в зависимости от микроархитектуры. В обеих схемах связанные с RS киоски попадают в эту категорию.
  • ROB: Это удерживает все мопы для их удаления в программном порядке.
  • BOB: Буфер порядка ветвления связывает состояние регистра с каждым спекулятивная ветвь (условная или косвенная) для обеспечения быстрого восстановления неверного прогноза.
  • LM: матрица загрузки отслеживает зависимости регистра между любыми мопами в RS и всеми мопами загрузки в RS (т. е. моп принимает в качестве входа физический регистр это место назначения загрузки, которое предшествует в программном порядке). LM может заполниться до LB, когда слишком много мопов, которые зависят от небольшого количества нагрузок. Если имеется несколько зависимостей, но слишком много загрузок, то LB может сначала заполниться.
  • PRRT: Каждый раз, когда происходит сбой uop, который изменяет физический регистр, таблица восстановления физического регистра обновляется, чтобы указать, что физический регистр который раньше отображал старую версию того же архитектурного регистра, теперь может быть восстановлен (потому что теперь есть новое отображение для этого регистра). Эта структура отслеживает выделенные физические регистры. Если распределитель требует выделения физического регистра, в PRRT должна быть свободная запись. В противном случае он останавливается.
  • PHT: отслеживает все текущие отображения каждого архитектурного регистра в один или несколько физических регистров. Эта структура используется для поддержки быстрого восстановления ветвлений.
  • Свободные списки INT и SIMD: существует logi c, который восстанавливает регистры на основе информации из PRRT. Когда физический регистр восстанавливается, он добавляется в структуру, называемую свободным списком, что фактически делает его свободным для распределения. Есть два бесплатных списка, один для регистров GP, а другой для регистров SIMD. Эти списки используются распределителем, чтобы знать, какие регистры свободны. Задержки, связанные с доступностью физических регистров, попадают в эту категорию.
  • FPCW: Инструкция, записывающая в управляющее слово с плавающей запятой, такое как FLDCW, может останавливать конвейер до тех пор, пока все предыдущие мопы не завершат выполнение. Условия зависят от микроархитектуры и изменяемых битов FPCW (см. Раздел 3.8.3 руководства по оптимизации Intel). Эти киоски учитываются здесь.
  • MXCSR: Это похоже на FLDCW. Инструкция, записывающая в регистр MXCSR, например, LDMXCSR, может остановить конвейер до тех пор, пока все более ранние операции не завершатся. Микроархитектура может переименовывать MXCSR, но если нет, то она должна завершить, например, sh более ранние математические инструкции, прежде чем изменять режим округления.
  • Другие: Есть много других причин остановки, которые не попадают в любая из предыдущих категорий. Intel решила не упоминать их.

Событие, которое вы называете RESOURCE_STALLS.OTHER, включает в себя следующие категории: BOB, LM, PRRT, PHT, бесплатные списки и другие. Я думаю, что вы останавливаетесь на LM. Попробуйте изменить загрузку на инструкции без памяти, которые записывают одни и те же регистры назначения, и посмотрите, станет ли RESOURCE_STALLS.OTHER незначительным.

...