Как уже говорилось в первой части, процессор POWER5™ оснащен шестью
счетчиками производительности, два из которых предназначены для
подсчета выполненных инструкций PowerPC® и общего количества тактов, а
остальные четыре предназначены для подсчета других типов событий.

Процессор POWER5 способен выполнять одну группу команд за такт (в
группе может быть до пяти инструкций). Некоторые инструкции PowerPC
раскладываются на несколько IOPS (число выполненных инструкций PowerPC)
во время декодирования и могут охватывать несколько групп. Блок
мониторинга производительности (PMU) процессора POWER5 может
подсчитывать как общее количество выполненных групп, так и количество
групп, содержащих хотя бы одну инструкцию PowerPC. Разница этих
показателей равна количеству дополнительных групп расширения. Упрощенно
говоря, CPI можно разделить на рабочую часть — когда процессор выполняет работу (обрабатывает группы) и холостую часть
– когда процессор не выполняет инструкции (отношение общего количества
тактов к количеству выполненных групп). Холостую часть можно, в свою
очередь, разделить на такты с пустым конвейером (GCT empty) и такты с непустым конвейером, когда выполнение останавливается (stall — GCT empty).

Такое разделение и наличие нескольких счетчиков дает возможность
осуществлять более точный анализ производительности путем сравнения
соответствующей статистики для расчета некоторых характеристик
производительности, которые процессор не может измерить
непосредственно.

таблице 1
представлена модель разбора CPI, в которой все такты разделены на три
типа: рабочие такты, такты с пустой таблицей выполнения (GCT empty) и
холостые такты. Количество рабочих тактов – это количество тактов,
необходимых для группировки. Простои, возникающие в противном случае,
могут быть отнесены либо к пустой таблице выполнения, либо к холостым
тактам. Таблица выполнения становится пустой, когда за такт не
выполняется ни одной группы из-за ошибок кэша инструкций или ошибок
ветвления. Холостые циклы возникают из-за одной из следующих
инструкций: LSU, FXU, длинная FXU (все типы div, mtspr, mfspr), FPU и
длинная FPU (все формы fsqrt, fdiv) или таких событий, как ошибки кэша
данных, отказы или отказы при трансляции (ошибки ERAT).

События являются иерархичными. Простои в блоке загрузки и хранения
(LSU) включают в себя ошибки кэша данных и отказы. Простои из-за
отказов включают в себя простои при трансляции из-за ошибок
преобразования действительных адресов (Effective to Real Address
Translation, ERAT). Этот метод фиксирует только последнее условие перед
очисткой и не определяет зависимости. Например, блок операций с
фиксированной точкой (FXU) добавляет инструкцию, зависящую от
инструкции загрузки в той же группе, которая вызывает ошибку в кэше
данных, в этом случае в качестве причины простоя будет указан FXU. При
одновременном указании на несколько событий в первую очередь имеют
приоритет события загрузки и сохранения; также ошибки кэша данных имеют
приоритет перед отказами. Как правило, простои, связанные с пустой
таблицей выполнения, вызваны ошибками кэша инструкций и ветвления.
POWER5 интеллектуально отслеживает эти события, так же как и простои.
Подсчет начинается при очистке GCT и прекращается когда в GCT
появляется хотя бы одна группа.

События производительности, перечисленные в таблице 1, определяются следующим образом:

  • Всего тактов = PM_CYCLES
  • Выполненных тактов = PM_GRP_CMPL
  • Выполненных тактов = PM_INST_CMPL (SCOMx360 настроено с битами 0-10 = 0 00 0000 0000)
  • Рабочих тактов PowerPC = PM_PPC_CMPL (или PMC 5)
  • Накладных расходов на расщепление/микропрограммирование = PPC_Completion_Cycles — PPC_Base_Completion_Cycles
  • Тактов с пустой таблицей выполнения (GCT empty) = PM_GCT_EMPTY
  • Промахов кэша инструкций = PM_GCT_EPMTY_IC_MISS
  • Ошибок ветвления = PM_GCT_EMPTY_BR_MPRED
  • Других ошибок GCT = GCT_Empty — Промахов кэша инструкций — Ошибок ветвления
  • Выполненных холостых тактов = Total cycles — Completion cycles — GCT empty
  • Простоев инструкций в блоке LSU = PM_CMPLU_STALL_LSU
  • Отказов в блоке LSU = PM_CMPLU_STALL_REJECT
  • Отказов трансляции в блоке LSU = PM_CMPLU_STALL_ERAT_MISS
  • Других простоев в блоке LSU = Stall by LSU Reject — Stall by LSU Translation Reject
  • Ошибок кэша данных в блоке LSU = PM_CMPLU_STALL_DCACHE_MISS
  • Простоев из-за задержек LSU = Stall by LSU Instruction — Stall by LSU Reject- Stall by LSU Dcache miss
  • Простоев из-за инструкций в блоке FXU = PM_CMPLU_STALL_FXU
  • Простоев из-за инструкций DIV,MTSPR или MFSPR = PM_CMPLU_STALL_DIV
  • Простоев из-за задержек FXU = Stall by FXU Instruction — Stall by DIV,MTSR, or MFSPR
  • Простоев из-за инструкций в блоке FPU = PM_CMPLU_STALL_FPU
  • Простоев из-за инструкций FDIV или FSQRT = PM_CMPLU_STALL_FDIV
  • Простоев из-за задержек FPU = Stall by FPU Instruction — Stall by FDIV,FSQRT
  • Других простоев = Completion Stall cycles — Stall by LSU Instruction — Stall by FXU Instruction — Stall by FPU Instruction

В таблице 1
приведен разбор компонентов CPI и событий для расчета. Параметры в
заштрихованных ячейках измеряются непосредственно оборудованием. Общее
число тактов представляет суммарное значение CPI. Значение тактов в
каждой категории измеряется счетчиками производительности или
вычисляется на основе измеренных значений. Например, значение
показателя Тактов с пустой таблицей выполнения <B> в таблице 1 раскладывается на три составляющих: Промахов кэша инструкций <B1>, ошибок ветвления <B2> Других (очисток и т. д.) <B4: (B)-(B1)-(B2)>.
<B1> и <B2> являются измеряемыми значениями, а <B4>
вычисляется из значений <B>, <B1> и <B2>.

таблицы 1 собраны следующими 16 счетчиками из семи групп pmcount: 0, 1, 5, 28, 29, 30 и 31. Их описание приведено в таблице 2.

первой статье серии.

таблице 3.

таблице 3
значение CPI для рассматриваемой рабочей нагрузки составляет 2,57, что
немного превышает средний уровень. Если разложить CPI на составляющие,
выяснится, что примерно 14% выполненных тактов были затрачены на
выполнение работы, а остаток был потрачен на различные задержки. Около
8.7% CPI пришлось на такты с пустой таблицей выполнения, из которых
4.78% были вызваны ошибками ветвления, что можно считать небольшим
значением, если сравнить его с ошибками кэша данных — 34.23%. Это
наблюдение приводит к выводу, что высокое значение CPI в основном
вызвано ошибками кэша данных. В действительности общие задержки
инструкций LSU составляют 48.7% в сравнении с задержками инструкций FXU
12.9% и задержками инструкций FPU 2.1%. Причина высоких задержек из-за
LSU, вероятно, кроется в подсистеме памяти, включая набор памяти
программы, задержку памяти, иерархию памяти, размер кэша или размер
TLB.

Ресурсы).

В таблице 4
приведен разбор CPI для данного приложения. Видно, что 0,31 или 13%
суммарного CPI затрачивается процессором для выполнения инструкций, а
2,11, или 87%, тратится на различные задержки. При простое конвейера
1,63, или 68%, CPI приходится на блок загрузки и хранения (LSU).
Дальнейшее изучение данных показывает, что 1,43 из 1,63, или 88% CPI,
расходуется на ошибки кэша данных.

Ресурсы)
описано, как в системах на базе POWER5 используется аппаратное
устройство предварительной выборки для загрузки данных в кэш L1.

«Когда инструкция загрузки пропускает последовательно несколько строк
кэша по восходящей или нисходящей, устройство предварительной выборки
инициирует обращение к строкам кэша, относящимся к будущим инструкциям
загрузки. Чтобы добиться того, чтобы необходимые данные находились в
нужный момент в кэше данных L1, при обращении инструкции загрузки к
данным из новой строки кэша инициируется предварительная выборка данных
в кэш L1. Одновременно запрашивается передача строки в кэш L2 из
памяти. Так как задержка при загрузке строки из памяти в кэш L2 больше,
чем при перемещении ее из кэша L2 в L1, устройство предварительной
выборки запрашивает данные из памяти на двенадцать строк вперед от
строки, связанной с загружаемой инструкцией. Для каждого процессора
поддерживается восемь таких потоков.»

В таблице 5
показаны данные статистики очисток, где 96% очистками вызваны
накладными расходами LSU. При этом количество инструкций на каждый
сброс LSU достаточно мало, а невыровненные загрузки составили 5%, с
долей ок. 2% от общего числа. В идеале доля невыровненных загрузок
должна была бы стремиться к 0%.

Ресурсы).
Компилятор IBM XL C/C++ Enterprise Edition Version 7.0 для AIX
поддерживает параметр –qalign, позволяющий указать правила выравнивания
данных и кода. По умолчанию используется группировка Power, при которой
элементы векторного типа выравниваются по границе 16 байт, а первый
элемент имеет естественное выравнивание. Альтернативой является
естественное выравнивание, при котором все элементы имеют естественные
границы выравнивания. Например, тип данных float выравнивается по
границе 4 байт, тип данных double – по границе 8 байт, тип данных long
double – по границе 16 байт, тип данных pointer – по границе 4 байт, и
т.д. В таблице 6
показано влияние параметра компилятора -qalign=natural на тестируемое
приложение. Процент и коэффициент очисток LSU после перекомпиляции
программы с параметром -qalign=natural стали нулевыми. Коэффициент и
доля невыровненных загрузок также стали равны нулю. Количество
инструкций на очистку LSU возросло почти в 1000 раз, что демонстрирует
важность выравнивания инструкций загрузки и сохранения для устройства
предварительной выборки POWER5.

таблице 7 показано влияние параметра компилятора -qalign=natural на результаты разбора CPI. В столбце После
приведены значения после перекомпиляции приложения с параметром
-qalign=natural. Значение CPI, связанное с ошибками LSU, уменьшилось с
1,63 до 0,32, количество холостых тактов уменьшилось с 2,08 до 0,75, а
общее значение CPI стало 1,04 вместо 2,42.

Таблица 7. Разбор CPI, анализ 1

Before After
Рабочих тактов Рабочих тактов Рабочих тактов PowerPC 0.31 0.29
Накладные расходы на расщепление 0.00 0.00
Максимальное значение группировки 0.00 0.00
Всего рабочих тактов 0.31 0.29
Тактов с пустой таблицей выполнения Промахов кэша инструкций 0.02 0.00
Ошибок ветвления 0.00 0.00
Ошибок сохранения 0.00 0.00
Других (сбросов и т .д.) 0.01 0.01
Всего тактов с пустой таблицей выполнения 0.03 0.00
Холостых тактов (CSC) Простоев из-за инструкций в блоке LSU Простоев из-за отказов Простоев при трансляции 0.00 0.00
Других отказов 0.09 0.06
Простоев из-за ошибок кэша данных 1.43 0.32
Простоев из-за задержек LSU 0.10 0.07
Всего простоев из-за инструкций в блоке LSU 1.63 0.45
Простоев из-за инструкций в блоке FXU Простоев из-за инструкций Div/MTSPR/MFSPR 0.00 0.00
Простоев из-за задержек FXU 0.03 0.01
Всего простоев из-за инструкций в блоке FXU 0.03 0.01
Простоев из-за инструкций в блоке FPU Простоев из-за инструкций FDIV/FSQRT 0.00 0.00
Простоев из-за задержек FPU 0.40 0.27
Всего простоев из-за инструкций в блоке FPU 0.40 0.27
Других простоев 0.02 0.02
Всего холостых тактов 2.08 0.75
Общее значение CPI 2.42 1.04

Заключение

В этой статье показано, что анализ CPI может служить как для изучения
производительности микропроцессора, так и для настройки программного
обеспечения. Благодаря средствам мониторинга производительности,
имеющимся в процессоре POWER5, анализ работы программ при помощи
разбора CPI становится полезным инструментом для анализа влияния
архитектуры системы на производительность.

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34