Технология Hyper-Threading в вычислительных системах

Технология Hyper-Threading была создана корпорацией Intel в целях повышения производительности и эффективности серверных систем. Она дополняет традиционную многопроцессорность, обеспечивая более высокий параллелизм и запас производительности для ПО с поддержкой потоков. Напомним, что под потоком (или тредом, thread) в данном случае понимают объект (таких объектов может быть несколько), создаваемый ОС внутри процесса и выполняющий инструкции программы. Вообще говоря, Hyper-Threading - это форма синхронной многопотоковой технологии SMT (Simultaneous Multi-Threading Technology), которая позволяет одновременно выполнять на одном процессоре множество потоков, создаваемых программными приложениями. Работа множества потоков достигается за счет дублирования архитектурных состояний (логических процессоров) при совместном использовании единого набора ресурсов процессора. По мере того как применение параллелизма в работе программ и процессоров получает все большее распространение, современные серверные платформы все чаще обращаются к использованию потоков для повышения общей производительности системы. Серверные приложения адаптируются - разделяются на несколько потоков инструкций - и в результате получают возможность более полно реализовать преимущества многопроцессорности. Потоки позволяют параллельно выполнять процессы и одновременно выполнять одним процессом различные части программы на различных процессорах. Ход выполнения потоков строго отслеживается логическим процессором, а ресурсы, необходимые для их выполнения, - это функциональные модули процессора, реализующие то или иное действие: сложение, перемножение, загрузку и т. п.

Для повышения производительности и пропускной способности современных приложений в семействе процессоров Intel Xeon технология Hyper-Threading используется совместно с микроархитектурой NetBurst. Появление Xeon изменило подход к разработке процессоров общего назначения, позволив исполнять несколько программных потоков на одном ядре процессора. Hyper-Threading предусматривает параллелизм на уровне потоков (Thread-Level-Parallelism, или TLP), что приводит к росту эффективности использования ресурсов. ОС, поддерживающие многопроцессорность, способны диспетчеризовать потоки для организации параллельной обработки на нескольких процессорах в пределах сервера. Серверные приложения могут без модификаций выполняться на серверных процессорах семейства Xeon и пользоваться преимуществами параллелизма уровня потоков на каждом процессоре системы.

Предполагается, что серверные приложения для многопроцессорных систем получают выигрыш от применения технологии Hyper-Threading в таких областях, как обслуживание Интернета, поисковые машины, базы данных подразделений или малых предприятий, а также почтовые серверы, файл-серверы и серверы печати. Их работа ускоряется благодаря тому, что технология Hyper-Threading сокращает время отклика и повышает производительность обработки транзакций. Разработчики полагают, что со временем все большее число программ будет оптимизироваться для использования процессорного параллелизма и, соответственно, будет расти эффективность технологии Hyper-Threading. Измерения, выполненные в Intel Microprocessor Software Labs, показали, что эта технология способна увеличить производительность для функций Microsoft Active Directory на 18%, для Microsoft SQL Server - на 22%, для Microsoft Exchange - на 23%, а для Microsoft IIS - на 30%.

Принцип действия

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

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

На рис. 28 одна конфигурация представляет собой традиционную многопроцессорную систему с двумя физическими процессорами, каждый из которых имеет свой собственный набор ресурсов выполнения и собственное, единственное архитектурное состояние. Другая конфигурация - это система на основе процессоров семейства Intel Xeon, где каждый процессор использует технологию Hyper-Threading.

Технология Hyper-Threading в вычислительных системах - student2.ru
Рис. 28. Эволюция многопроцессорных систем.

Как видно, архитектурное состояние каждого процессора дублировано, но каждый из них по-прежнему имеет один набор ресурсов исполнения. При диспетчеризации потоков ОС воспринимает два отдельных архитектурных состояния как два "логических" процессора.

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

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

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

Hyper-Threading привносит совсем немного новых схем - в основном это дублирование регистров и назначение ресурсов потокам. При этом дублируются как видимые, так и внутренние (физические) регистры. Начальные стадии конвейера не меняются, однако задействуются атрибуты (биты, указывающие на принадлежность к определенной нити). Исполнительное ядро со всеми входящими в него устройствами также не изменяется, но его ресурсы разделяются между двумя нитями. Блок процессора, отвечающий за восстановление архитектурного состояния на основании выполненных микроопераций, работает последовательно (по нитям). Среди добавленных в процессор компонентов стоит упомянуть средства APIC (Advanced Programmable Interrupt Controller), назначающие прерывания для обработки разными процессорами в мультипроцессорной системе. На рис. 29 показаны упрощенные схемы процессоров с механизмом Hyper-Threading и без него. Согласно имеющейся информации, включение возможностей новой технологии добавляет к площади кристалла менее 5%.

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

Технология Hyper-Threading в вычислительных системах - student2.ru
Рис. 29. Обычный процессор (а) и процессор с Hyper-Threading (б).

Использование ресурсов

Чтобы понять, как технология Hyper-Threading улучшает использование ресурсов, рассмотрим многопроцессорную систему, состоящую из двух обычных суперскалярных процессоров, каждый из которых может выполнять по три инструкции за один цикл и на которых запущено по два отдельных потока. На рис. 30,а небольшими прямоугольниками показаны функциональные блоки. Каждый набор из трех горизонтальных соответствует трем модулям, задействованным в данном цикле работы процессора. Белый цвет прямоугольника указывает, что операционный модуль простаивает в данном цикле (например, если в течение одного такта в белый цвет окрашен лишь один прямоугольник, то простаивает 1/3 ресурсов, а 2/3 задействованы). Вертикальные наборы указывают на степень использования трех операционных модулей во времени (на протяжении нескольких тактов работы процессора). Чем больше белых прямоугольников, тем ниже эффективность использования ресурсов. Иногда задействованными оказываются все ресурсы выполнения, а иногда они простаивают, например из-за промахов в кэш-память, неверного предсказания ветвления или взаимозависимости инструкций для каждого потока. Один процессор выполняет обработку потока, представленного темно-синим цветом, а поток другого процессора показан светло-синим. В данном примере пиковая производительность составляет шесть инструкций на такт, по три инструкции на каждый процессор.

Технология Hyper-Threading в вычислительных системах - student2.ru
Рис. 30. Сравнение двухпроцессорных систем.

На рисунке 30,б показан результат применения технологии Hyper-Threading на примере двух процессоров, одновременно выполняющих два отдельных потока на каждом из процессоров. Один из процессоров одновременно обрабатывает темно- и светло-синие потоки, а другой работает с еще двумя. Видно, что в этом случае модули исполнения задействуются более часто, что приводит к уменьшению времени простоя для каждого из процессоров. Эффективность использования ресурсов каждым процессором может значительно возрасти, но она зависит также от эффективности алгоритма использования потоков, заложенного в прикладную программу. Если приложение многопоточное и при этом различные потоки могут параллельно использовать различные ресурсы (такие, как планирование интенсивных целочисленных вычислений на одном логическом процессоре при выполнении вычислений с плавающей запятой на другом), то пропускная способность может значительно возрасти как для каждого из процессоров, так и для всей многопроцессорной системы.

Детали микроархитектуры

В рамках технологии Hyper-Threading ресурсы исполнения на процессорах Xeon совместно используются двумя архитектурными состояниями, или двумя логическими процессорами. Большинство ресурсов исполнения сосредоточено в блоке быстрого исполнения (Rapid Execution Engine) и встроенной кэш-памяти, которые одновременно обрабатывают инструкции от двух потоков. Механизм выборки и доставки (Fetch and Deliver engine) и блок переупорядочения и изъятия (Reorder and Retire) выделяют ресурсы, которые поочередно предоставляются в распоряжение обоих потоков.

Механизм выборки и доставки

Этот механизм организует поочередную выборку инструкций то из одного логического процессора, то из другого и пересылает эти инструкции в блок быстрого исполнения (Rapid Execution Engine) для обработки. На первом уровне кэш-памяти (Execution Trace Cache) поочередно делается выборка по одной строке на каждый логический процессор. Это происходит в том случае, если оба логических процессора нуждаются в этой кэш-памяти. Если один из логических процессоров не запрашивает использование кэш-памяти, то другой может воспользоваться полной полосой пропускания этого типа кэш-памяти.

Rapid Execution Engine

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

Ядру исполнения по большей части "очевидно", какие из инструкций какому логическому процессору принадлежат, а планировщики не различают инструкций от различных логических процессоров - они просто переназначают независимые очереди инструкций на доступные для выполнения ресурсы. Например, планировщик может за один цикл диспетчеризовать две инструкции из потока №1 и одну инструкцию из потока №2.

Встроенная кэш-память

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

Наши рекомендации