Э. Таненбаум - Архитектура компьютера (1127755), страница 154
Текст из файла (страница 154)
Эта стратегия позволяет переключаться раньше обычного (срэзу после декодирования команды) и исключает бесконечные циклы. Иными словами, исполнение продолжается до того момента, пока не обнаружится возможность возникновения проблемы, после чего следует переключение. Такие частые переключения роднят крупномодульную многопоточность с мелкомодульной. Вне зависимости от используемого варианта многопоточности, необходимо как-то отслеживать принадлежность каждой операции к тому или иному программному потоку.
В рамках мелкомодульной многопоточности каждой операции присваивается идентификатор потока, поэтому при перемещениях по конвейеру ее принадлежность не вызывает сомнений. Крупномодульная многопоточность предусматривает возможность очистки конвейера перед запуском каждого последующего потока. В таком случае четко определяется идентичность потока, исполняемого в данный момент. Естественно, данная методика эффективна только в том случае, если паузы между переключениями значительно больше времени, необходимого для очистки конвейера. Все сказанное относится к процессорам, способным вызывать не более одной команды за тактовый цикл.
Однако мы знаем, что для современных процессоров это ограничение не актуально. Применительно к изображению на рис. 8.6 мы допускаем, что процессор может вызывать по 2 команды за цикл, однако утверждение о невозможности запуска последующих команд в случае простоя преды- Внутрипроцессорный параллелизм 609 душей остается в силе. Рисунок 8.6, а иллюстрирует механизм мелкомодульной многопоточности в сдвоенном суперскалярном процессоре. Как видно, в потоке А первые две команды запускаются во время первого цикла, однако в потоке В во втором цикле запускается только одна команда.
Цикл — и- б Цикл — и в Цикл — к в Рис. 8.8. Многопоточность в сдвоенном процессоре; мелкомодульная многопоточность (в); крупномодульная многопоточность (б); синхронная многопоточность (в) На рис. 8.6, б изображена реализация крупномодульной многопоточности в сдвоенном процессоре со статическим планировщиком, который исключает бесконечные циклы при простое команд.
Здесь программные потоки выполняются по очереди, процессор вызывает по две команды в каждом потоке, пока не обнаруживает простоя; в следующем такте после простоя начинается исполнение следующего потока. В суперскалярных процессорах есть еще один способ организации многопоточности — так называемая синхронная многопоточность (з)пш11апеоцз пш)1(- 1)тгеа()1п8), которую иллюстрирует рис. 8.6, в.
Эта методика представляет собой усовершенствованный вариант крупномодульной многопоточности, где каждый программный поток может запускать по две команды за такт, однако в случае простоя с целью обеспечения полной загрузки процессора запускаются команды следующего потока.
При синхронной многопоточности полностью загружаются все функциональные блоки. В случае невозможности запуска команды из-за занятости функционального блока выбирается команда из другого потока. На рисунке предполагается, что в цикле 11 простаивает команда В8, поэтому в цикле 12 запускается команда С7. Дополнительные сведения о многопоточности можно почерпнуть в 153, 106, 108). О многопоточности и спекулятивном исполнении рассказывается в [1911. МНОГОПОТОЧНОСТЬ В РОПк!ЦП) 4 Разобравшись с теорией многопоточности, рассмотрим практический пример— Репьшш 4. Уже на этапе разработки этого процессора инженеры 1пте! продолжа- ли работу над повышением его быстродействия без внесения изменений в про- граммный интерфейс.
Рассматривалось пять простейших способов: 1. Повышение тактовой частоты. 2. Размещение на одной микросхеме двух процессоров. 3. Введение новых функциональных блоков. 610 Глава 8. Параллельные компьютерные архитектуры 4. Удлинение конвейера. 5. Использование многопоточности. Самый очевидный способ повышения быстродействия заключается в том, чтобы повысить тактовую частоту, не меняя другие параметры.
Как правило, каждая последующая модель процессора имеет несколько более высокую тактовую частоту, чем предыдущая. К сожалению, прн прямолинейном повышении тактовой частоты разработчики сталкиваются с двумя проблемами: увеличением энергопотребления (что актуально для портативных компьютеров и других вычислительных устройств, работающих на аккумуляторах) и перегревом (что требует создания более эффективных теплоотводов).
Второй способ — размещение на микросхеме двух процессоров — сравнительно прост, но он сопряжен с удвоением площади, занимаемой микросхемой. Если каждый процессор снабжается собственной кэш-памятью, количество микросхем на пластине уменьшается вдвое, но это также означает удвоение затрат на производство.
Если для обоих процессоров предусматривается общая кэш-память, значительного увеличения занимаемой площади удается избежать, однако в этом случае возникает другая проблема — объем кэш-памяти в пересчете на каждый процессор уменьшается вдвое, а это неизбежно сказывается на производительности.
Кроме того, если профессиональные серверные приложения способны полностью задействовать ресурсы нескольких процессоров, то в обычных настольных программах внутренний параллелизм развит в значительно меньшей степени. Введение новых функциональных блоков также не представляет сложности, но здесь важно соблюсти баланс.
Какой смысл в десятке блоков АЛУ, если микросхема не может выдавать команды на конвейер с такой скоростью, которая позволяет загрузить все эти блоки? Конвейер с увеличенным числом ступеней, способный разделять задачи на более мелкие сегменты и обрабатывать их за короткие периоды времени, с одной стороны, повышает производительность, с другой, усиливает негативные последствия неверного прогнозирования переходов, кэш-промахов, прерываний и других событий, нарушающих нормальный ход обработки команд в процессоре.
Кроме того, чтобы полностью реализовать возможности расширенного конвейера, необходимо повысить тактовую частоту, а это, как мы знаем, приводит к повышенным энергопотреблению и теплоотдаче. Наконец, можно реализовать многопоточность. Преимущество этой технологии состоит во введении дополнительного программного потока, позволяющего ввести в действие те аппаратные ресурсы, которые в противном случае простаивали бы.
По результатам экспериментальных исследований разработчики 1псе1 выяснили, что увеличение площади микросхемы на 5 У4 при реализации многопоточности для многих приложений дает прирост производительности на 25 У4. Первым процессором 1пге1 с поддержкой многопоточности стал Хеоп 2002 года. Впоследствии, начиная с частоты 3,06 ГГц, многопоточность была внедрена в линейку Репггаш 4. 1псе1 называет реализацию многопоточности в Репггпш 4 гнперпоточностыо (Ьуреггпгеайпй).
Основной принцип гиперпоточности — одновременное исполнение двух программных потоков (или процессов — процессор не отличает процессы от про- Внутрипроцессорный параллелизм 61 1 граммных потоков). Операционная система рассматривает гиперпоточный процессор Репбнш 4 как двухпроцессорный комплекс с общими кашами и основной памятью. Планирование операционная система выполняет для каждого программного потока отдельно. Таким образом, в одно и то же время могут выполняться два приложения. К примеру, почтовая программа может отправлять или принимать сообщения в фоновом режиме, пока пользователь взаимодействует с интерактивным приложением — то есть демон и пользовательская программа выполняются одновременно, как будто системе доступно два процессора.
Прикладные программы, предусматривающие возможность исполнения в виде нескольких программных потоков, могут задействовать оба чвиртуальных процессора». Например, программы редактирования видеоданных обычно позволяют пользователям применять фильтры ко всем кадрам. Такие фильтры корректируют яркость, контраст, цветовой баланс и другие свойства кадров. В такой ситуации программа может назначить один виртуальный процессор для обработки четных кадров, а другой — для обработки нечетных. При этом два процессора будут работать совершенно независимо друг от друга. Поскольку программные потоки обращаются к одним и тем же аппаратным ресурсам, необходима координация этих потоков.
В контексте гиперпоточности разработчики 1псе1 выделили четыре полезных стратегии управления совместным потреблением ресурсов: дублирование ресурсов, а также жесткое, пороговое и полное разделение ресурсов. Рассмотрим эти стратегии. Начнем с дублирования ресурсов (гезоигсе дир1!саг1оп). Как известно, некоторые ресурсы с целью организации программных потоков дублируются. Например, так как каждому программному потоку требуется индивидуальное управление, нужен второй счетчик команд. Кроме того, необходимо ввести вторую таблицу отображения архитектурных регистров (ЕАХ, ЕВХ и т. д.) на физические регистры; аналогичным образом, дублируется контроллер прерываний, поскольку обработка прерываний для каждого потока производится индивидуально.