Корпорация 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
незначительным.