630 Глава 15. Потоковые и редукционные вычислительные системы

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

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

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

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

Для иллюстрации рассмотрим некоторые особенности реализации гиперпотоковой технологии в процессоре Pentium 4 Хеоп. Процессор способен параллельно обрабатывать два потока в двух логических процессорах. Чтобы выглядеть для операционной системы и пользователя как два логических процессора, физический процессор должен поддерживать информацию одновременно для двух отдельных и независимых потоков, распределяя между ними свои ресурсы. В зависимости от вида ресурса применяются три подхода: дублирование, разделение и совместное использование.

НЕ нашли? Не то? Что вы ищете?

Дублированные ресурсы. Для поддержания двух полностью независимых контекстов на каждом из логических процессоров некоторые ресурсы процессора необходимо дублировать. Прежде всего, это относится к счетчику команд (IP, Instruction Pointer), позволяющему каждому из логических процессоров отслеживать адрес очередной команды потока. Для параллельного выполнения несколь­ких процессов необходимо столько IP, сколько потоков команд необходимо отелем живать одновременно. Иными словами, у каждого логического процессора должен быть свой счетчик команд. В процессоре Хеоп максимальное количество потоков команд равно двум и поэтому требуется два счетчика команд. Кроме того, в процессоре имеются две таблицы распределения регистров (RAT, Register Allocation Table), каждая из которых обеспечивает отображение восьми регистров общего назначения (РОН) и восьми регистров с плавающей запятой (РПЗ), относящихся к одному логическому процессору, на совместно используемый регистровый файл из 128 РОН и 128 РПЗ. Таким образом, RAT — это дублированный ресурс, управляющий совместно используемым ресурсом (регистровым файлом).

Разделенные ресурсы. В качестве одного из видов разделенных ресурсов в Хеоп выступают очереди (буферная память, организованная по принципу FIFO), рас-

Вычислительные системы с управлением вычислениями от потока данных 631

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

Применительно к другому виду очередей — очередям диспетчеризации команд (их в процессоре три) — можно говорить о динамическом разделении. Вместо того чтобы из предусмотренных в каждой очереди двенадцати входов фиксировано назначить входы 0-5 логическому процессору (ЛП) 0, а входы 6-11 — логическому процессору 1, каждому ЛП разрешается использовать любые входы очереди, лишь бы их общее число не превысило шести.

С позиций логического процессора и потока между статическим и динамическим разделением нет никакой разницы — в обоих случаях каждому ЛП выделяется своя половина ресурса. Различие становится существенным, если в качестве отправной точки взять физический процессор. Отсутствие привязки потоков к конкретным входам очереди позволяет не принимать во внимание, что имеются два потока, и расценивать обе половины как единую очередь. Очередь диспетчеризации команд просто просматривает каждую команду в общей очереди, оценивает зависимости между командами, проверяет доступность ресурсов, необходимых для выполнения команды, и планирует команду к исполнению. Таким образом, выдача команд на исполнение не зависит от того, какому потоку они принадлежат. Динамическое разделение очередей диспетчеризации команд предотвращает монополизацию очередей каким-либо одним из логических процессоров.

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

Совместно используемые ресурсы. Этот вид ресурсов в гиперпотоковой технологии считается определяющим. Чем больше ресурсов могут совместно использовать логические процессоры, тем большую вычислительную мощность можно «снять» с единицы площади кристалла процессора. Первую группу общих ресурсов образуют функциональные (исполнительные) блоки: целочисленные операционные устройства, блоки операций с плавающей запятой и блоки обращения (чтения/записи) к памяти. Эти ресурсы «не знают», из какого ЛП поступила команда. То же самое можно сказать и о регистровом файле — втором виде совместно используемых ресурсов.

Сила гиперпотоковой технологии — общие ресурсы — одновременно является и ее слабостью. Проблема возникает, когда один поток монополизирует ключевой ресурс (такой, например, как блок операций с плавающей запятой), чем блокирует другой поток, вызывая его остановку. Задача предотвращения таких ситуаций возлагается на компилятор и операционную систему, которые должны образовать потоки, состоящие из команд с максимально различающимися требованиями к совместно используемым ресурсам. Так, один поток может содержать команды, нуждающиеся главным образом в блоке для операций с плавающей запятой, а дру-