Справочник
Технологии »
»
»

Технология Hyper-Threading. Часть 1

Технология Hyper-Threading существовала и ранее вне x86 мира в виде технологии одновременной многопоточности (Simultaneous Multi-Threading, SMT).

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

Hyper-Threading

Работа множества потоков достигается за счет дублирования архитектурных состояний (логических процессоров) при совместном использовании единого набора ресурсов процессора.

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

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

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

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

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

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

Схема Hyper-Threading

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

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

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

Если один из логических процессоров не запрашивает использование кэш-памяти, то другой может воспользоваться полной полосой пропускания этого типа кэш-памяти.

Rapid Execution Engine

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

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

1 · 2
Справочник