8

# Тема 8. Технологии повышения производительности и мониторинга ресурсов

Цель: Рассмотреть основные технологии повышения производительности и мониторинга ресурсов используемых в микропроцессорных системах.

План:

1. Технология Hyper-Threading.

2. Виртуализация AMD и Intel.

1. Технология Hyper-Threading

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

Другой способ повышения производительности заключается в увеличении исполнительных блоков (Execution Units) внутри самого процессора. В этом случае возможно параллельное выполнение нескольких процессорных инструкций одновременно. Такая многозадачность реализована в том или ином виде во всех современных процессорах. Отход от последовательного выполнения команд, использование нескольких исполняющих блоков в одном процессоре позволяют одновременно обрабатывать несколько процессорных микрокоманд, то есть организовывать параллелизм на уровне инструкций (Instruction Level Parallelism, ILP), что, естественно, увеличивает общую производительность.

Поясним все вышесказанное на примере. Представьте себе гипотетический процессор, в котором имеется всего три исполнительных блока: блок для работы с целыми числами (арифметико-логическое устройство, ALU), блок для работы с числами с плавающей точкой (FPU) и блок для записи и чтения данных из памяти (Store/Load, S/L). Пусть, кроме того, каждая операция осуществляется за один такт процессора (См. Рисунок 12.1).

Предположим, что выполняется программа, состоящая из трех инструкций: первые две — арифметические действия с целыми числами, а последняя — сохранение результата. В этом случае вся программа будет выполнена за три такта процессора. В первом такте задействуется блок ALU процессора (красный квадрат на рисунке 4.6), во втором — также блок ALU, а в третьем — блок записи и чтения данных из памяти S/L. В этом случае мы имеем дело с классическим последовательным вариантом выполнения программы.

Повышение производительности процессора заключается в конечном счете в том, чтобы сократить время выполнения всей программы. Если не менять тактовую частоту, то это время можно сократить за счет уменьшения количества тактов для выполнения программы. Это можно сделать, если добавить количество исполняемых блоков. Если, к примеру, в нашем гипотетическом процессоре использовался бы не один, а два блока ALU, то две первые операции с целыми числами можно было бы выполнить одновременно, то есть за один такт. Для этого, конечно, необходимо, чтобы сами операции были независимыми, то есть результат одной из них не зависел от результата другой. Только в этом случае возможно параллельное выполнение команд. С учетом сделанных предположений добавление второго блока ALU в нашем гипотетическом процессоре позволяет сократить время выполнения всей программы на один цикл [Рисунок 12.2].

Впрочем, говорить о серьезном увеличении производительности за счет реализации параллелизма на уровне инструкций (ILP) не приходится. Причин тому несколько. Прежде всего, ошибки в предсказании ветвлений и прерывания вызывают сброс длинного конвейера Pentium 4, что серьезно сказывается на общем быстродействии процессора.

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

В современных приложениях в любой момент времени, как правило, выполняется не одна, а несколько задач или несколько потоков (threads) одной задачи, называемых также нитями. Давайте посмотрим, как будет вести себя наш гипотетический процессор при выполнении двух разных потоков задач [Рисунок 12.3]. Красные квадраты соответствуют использованию исполнительных блоков процессора одного потока, а синие квадраты — другого. Как и в предыдущем случае, допустим, что первый поток включает две независимые инструкции с использованием блока ALU и одну инструкцию по сохранению результата. Задача второго потока — загрузить необходимые данные из памяти (работа с блоком S/L), произвести операцию с действительными числами (числами с плавающей запятой) при помощи блока FPU и сохранить результат с использованием блока S/L. Если бы оба потока исполнялись изолированно, то для выполнения первого потребовалось бы два такта процессора, а для второго — три. При одновременном исполнении обоих потоков процессор будет постоянно переключаться между обоими потоками так, что за один такт процессора выполняются только инструкции какого-либо одного из потоков. Для исполнения обоих потоков всего потребуется пять процессорных тактов.

Самый простой способ заключается в том, чтобы использовать два процессора вместо одного. Такой подход типичен для серверных SMP-конфигураций. В этом случае рост производительности достигается за счет параллельного (Thread Level Parallelism, TLP) решения нескольких разных задач или нескольких потоков одной задачи на нескольких процессорах. Тогда в рассмотренном выше примере для выполнения всей задачи потребовалось бы не пять, а всего три процессорных такта (по времени выполнения второго потока).

В нашем примере выполнение двух арифметических операций с целыми числами первого потока можно совместить с загрузкой данных из памяти второго потока и выполнить все три операции за один такт процессора. Аналогично на втором такте процессора можно совместить операцию сохранения результатов первого потока с операцией с действительными числами (с плавающей запятой) второго потока [Рисунок 12.3].

Собственно, в таком параллельном выполнении двух потоков и заключается основная идея новой технологии Hyper-Threading.

Итак, технология Hyper Threading — это реализация одновременной многопоточности (Simultaneous Multi-Threading, SMT). Технология Hyper-Threading является промежуточной между многопоточной обработкой, осуществляемом в мультипроцессорных системах, и параллелизмом на уровне инструкций, реализованном в однопроцессорных системах.

Итак, разобравшись с идеями Hyper-Threading, перейдем к рассмотрению микроархитектуры процессора. Как уже отмечалось, технология Hyper-Threading занимает промежуточное положение между многопоточной обработкой, используемой в мультипроцессорных системах, и параллелизмом на уровне инструкций, реализованным в однопроцессорных системах. Для этого процессор должен иметь два «входа» для отдельных потоков, как если бы существовало два физических процессора, но при этом всего один конвейер обработки команд, как в реальном физическом процессоре, который использует оба потока. В этом случае один физический процессор представляется операционной системе как два логических. Таким образом, операционная система не видит разницы между одним SMT-процессором и двумя обычными процессорами. В обоих случаях операционная система направляет потоки с расчетом на двухпроцессорную систему. Далее все вопросы решаются на аппаратном уровне.

В процессоре с Hyper-Threading каждый логический процессор имеет свой собственный набор регистров (включая и отдельный счетчик команд), а чтобы не усложнять технологию, в ней не реализуется одновременное выполнение инструкций выборки/декодирования в двух потоках — такие инструкции выполняются поочередно. Параллельно же исполняются лишь обычные команды. Среди добавленных в процессор компонентов стоит также упомянуть средства APIC (Advanced Programmable Interrupt Controller), назначающие прерывания для обработки разными процессорами в мультипроцессорной системе.

С конструктивной точки зрения процессор с поддержкой технологии Hyper-Threading состоит из двух логических процессоров, каждый из которых имеет свои регистры и контроллер прерываний (Architectural State, AS), то есть две параллельно исполняемые задачи работают со своими собственными независимыми регистрами и прерываниями, но при этом используют одни и те же ресурсы процессора для выполнения задач. После активации каждый из логических процессоров может самостоятельно и независимо от других выполнять свою задачу, обрабатывать прерывания либо быть заблокированным. Таким образом, от реальной двухпроцессорной конфигурации новая технология отличается только тем, что оба логических процессора используют одни и те же исполняющие ресурсы, одну и ту же разделяемую между двумя потоками кэш-память и одну системную шину..

Новый процессор с поддержкой технологии Hyper-Threading требует новых чипсетов, BIOS, материнских плат и даже новых систем охлаждения и соответственно корпусов.

Рисунок 12.1 - Последовательное выполнение инструкций в гипотетическом процессоре

Рисунок 12.2 - Реализация параллелизма на уровне инструкций

Рисунок 12.3 - Выполнение двух потоков на процессоре без Hyper-Threading

Рисунок 12.4 - Параллельное выполнение двух потоков на процессоре с реализацией технологии Hyper-Threading

2. Виртуализация AMD и Intel

Виртуализация заключается в отделении ОС от аппаратной части. И здесь есть несколько подходов: полная двоичная и пара-виртуализация. Для пара-виртуализации необходимо вносить изменения в ОС. Но политика Microsoft раньше этого не позволяла. Поэтому на данный момент решения пара-виртуализации были реализованы, в основном, на Linux. Кстати, в сервере Longhorn или сразу за ним Microsoft планирует поддержать пара-виртуализацию.

Есть и решения полной двоичной виртуализации, например, VMWare. В нём сначала загружается Hypervisor, после чего подгружается немодифицированная ОС. Если быть точным, то в VMWare используется VMM, но разница между VMM и Hypervisor очень тонкая. В VMM (и версиях VMWare Server и Workstation) host-ОС и VMM имеют одинаковые права на "железо".

Наибольшие различия в производительности виртуализации AMD и Intel связаны со встроенным контроллером памяти. DEV (вектор исключения устройств) открывает гостевым устройствам прямой доступ к памяти (или запрещает доступ). У AMD проверка DEV реализована аппаратно и работает быстрее.

Впрочем, по мнению специалистов, DEV по своей сути эквивалентен расширениям VT-D и Virtualized PCI-X, которые аппаратно реализуют примерно то же самое, но, правда, в других местах архитектуры.

Второе отличие касается тегированных TLB (Translation Look-aside Buffer), которые содержат ссылки между виртуальными и реальными адресами страниц памяти. На иллюстрации ниже видно, что при переключении между виртуальными машинами AMD не сбрасывает таблицу TLB, а Intel это приходится каждый раз делать.

Литература: 6, стр. 113-117; 1, стр. 298-304.

Контрольные вопросы

1. Какие типы архитектур вы знаете?

2. Какой тип архитектуры лучше использовать при соединении 512 процессоров?

3. Почему количество процессоров системе ограничено при использовании архитектуры SMP?

4. Какой принцип построения межпроцессорных конфигураций наиболее эффективен в SMP-системах?

5. Объясните принцип работы Hyper-Threading?

6. В чем разница реальной двухпроцессорной конфигурации и технологии Hyper-Threading.