7.3.1 Мультитредовая модель выполнения программы
Мультитредовые процессоры с условно исполняемыми тредами используют агрессивную парадигму выполнения кода с целью извлечения условно исполняемых тредов из последовательной программы. В соответствии с данной парадигмой программа разбивается на совокупность единиц обработки, называемых далее сегментами, с помощью программных и аппаратных средств. Сегмент – часть программы, выполнению которой соответствует тред. Сегмент представляет собой непрерывную область последовательности команд (например, часть базисного блока, базисный блок, множество базисных блоков, одиночную итерацию цикла, полный цикл, обращение к функции и т. д.). Возможны различные методы формирования сегментов и организации их исполнения.
Для выполнения на мультитредовом процессоре сегменты программы статически разграничиваются аннотациями. Зависимости между операторами программы по управлению представляются как граф управляющих зависимостей (ГУЗ), в котором вершинами являются сегменты, а дугами задается порядок их выполнения. Динамика выполнения программы может рассматриваться как обход ГУЗ программы. На каждом шаге обхода мультитредовый процессор назначает один сегмент на один из процессорных элементов (ПЭ), предназначенный для выполнения треда, без учета фактического содержания сегмента, и продолжает обход ГУЗ от рассматриваемой вершины до следующей. Пример архитектуры мультитредового процессора показан на рисунке 7.5.
Сегмент назначается для выполнения некоторому процессорному элементу, передачей ему начального значения программного счетчика. Множество инициированных таким образом сегментов выполняется параллельно на процессорных элементах, результатом чего является выполнение множества команд за один процессорный такт.
Каждый из процессорных элементов выбирает и выполняет команды, принадлежащие выделенному ему сегменту. Значения разделяемых процессорными элементами регистров копируются в каждый ПЭ. Результат модификации содержимого регистров динамически направляется множеству параллельных ПЭ в соответствии с генерируемыми компилятором масками.
Доступ к памяти осуществляется спекулятивно (условно, по предположению), без знания последовательности предшествующих команд загрузки или сохранения. Обращение к данным осуществляется параллельно многим ПЭ, обработка приостанавливается только в случае истинной зависимости данных.
Мультитредовый процессор можно рассматривать как параллельную вычислительную систему, состоящую из совокупности ПЭ с программой-планировщиком, которая назначает сегменты на ПЭ. Как только сегмент назначен на ПЭ, этот ПЭ выбирает и выполняет команды сегмента, пока он не завершится. Множество ПЭ, каждый с собственным внутренним механизмом последовательного выполнения команд, поддерживают выполнение множества сегментов. Команды, содержащиеся внутри динамического окна исполнения мультитредового процессора, ограничены первой командой в самом раннем выполняемом сегменте и последней командой в последнем выполняемом сегменте. При условии, что каждый сегмент может содержать циклы и обращения к функциям, эффективный размер окна может быть чрезвычайно большим. Существенным является то, что не все команды внутри этого широкого диапазона одновременно рассматриваются для выполнения, а только ограниченный набор внутри каждого из ПЭ.
Рассмотрим приведенный на рисунке 7.6 ГУЗ для фрагмента программы с пятью базисными блоками А, В, С, D и Е. Одна из возможных динамических последовательностей выполнения базисных блоков имеет вид:
В этой последовательности и верхние, и нижние индексы обозначают итерации внешнего и внутреннего циклов соответственно.
Будем рассматривать итерацию внешнего цикла из ГУЗ, приведенного на рисунке 7.6 как сегмент. То есть статические базисные блоки А, В, С и D (так же, как поток управления через них) входят в состав сегмента. Можно назначить сегмент, соответствующий первой итерации внешнего цикла на первый процессор, соответствующий второй итерации цикла – на следующий процессор и т. д. Процессор, которому назначена в качестве сегмента первая итеративная последовательность, выполняет динамические команды базисных блоков .
Аналогично, следующие процессоры выполняют динамические команды базисных блоков и согласно второй и третьей итерации соответственно. В этом примере потенциальным результатом мультискалярного подхода является выполнение трех полезных команд в такте. Например, в данном такте процессоры могли бы выполнять команды из динамических базисных блоков одновременно.
Важно заметить, что сегменты хотя и разделены на группы команд, но не являются независимыми. Так как сегменты являются частями последовательного потока команд, то отношения по данным и управлению между индивидуальными командами должны поддерживаться в процессе выполнения. Ключевым вопросом в мультитредовой реализации является обеспечение связи по данным и управлению между параллельными процессорами. То есть, как обеспечить выполнение последовательного обхода ГУЗ, если фактически выполняется непоследовательный обход?
Последовательный обход поддерживается следующим образом. Во-первых, для каждого процессора обеспечивается последовательная модель выполнения назначенного ему сегмента. Во-вторых, предписывается последовательный порядок выполнения для совокупности процессоров, который поддерживается с помощью организации циклической очереди ПЭ. Указатели начала и конца очереди идентифицируют ПЭ, которые выполняют самый ранний и самый поздний из назначенных сегментов соответственно. Например, согласно рассматриваемому ГУЗ (рис.7.6), ПЭ в начале списка, выполняющий первую итерацию, предшествует ПЭ, выполняющему вторую итерацию, который, в свою очередь, предшествует ПЭ в конце списка, выполняющему третью итерацию.
По мере выполнения команд сегмента производятся и потребляются значения переменных программы. Эти значения связаны с местом хранения, а именно с регистрами и с памятью. Так как при последовательном выполнении область хранения переменных рассматривается как единый набор регистров и памяти, мультитредовое выполнение должно поддерживать такую же модель. Кроме того, должно гарантироваться, что значения используются и производятся так же, как и при последовательном выполнении. В рассматриваемом примере значения, используемые командами в динамическом базисном блоке , должны быть результатами выполнения последовательности блоков , а также предшествующих команд в . Чтобы обеспечить это, необходимо синхронизировать обмен между сегментами.
В случае использования регистровой памяти логика управления синхронизирует создание значений регистров в сегментах-предшественниках с потреблением этих значений в сегментах-преемниках. Производимые сегментом регистровые значения могут быть определены статически и отмечены в маске создания сегмента. В момент выработки соответствующего регистрового значения, если есть отметка в маске создания, это значение посылается через однонаправленный кольцевой канал (см. рис.7.5) последующим сегментам, т. е. в ПЭ, которые являются логическими преемниками ПЭ, выработавшего значение. Загружаемые из кольцевого канала в регистры значения, предназначенные для сегментов-преемников, определяются в маске накопления, которая является объединением масок создания активных сегментов-предшественников. Как только значения получены из ПЭ предшественников, очищаются признаки сохранения в ПЭ-преемниках. Если сегмент использует одно из этих значений, потребляющая команда может быть исполнена только в том случае, если значение было получено, иначе она ждет получения требуемого значения.
В отличие от значений регистров, для значений, хранимых в памяти, в силу динамического вычисления адресов нельзя заранее точно определить, какие из них используются или производятся сегментом. Если известно, что сегмент потребляет значение из памяти (используя команду загрузки), которое произведено (с помощью команды сохранения) в более раннем сегменте, возможно синхронизировать потребление и производство этого значения. То есть загрузка в сегменте-преемнике может быть отложена до тех пор, пока в сегменте-предшественнике не будет выполнена команда сохранения (похоже на ситуацию с регистрами, однако механизм синхронизации все же другой ввиду несоизмеримости размеров пространства имен).
В общем случае, когда такое знание недоступно, может быть предпринят консервативный или агрессивный подход. Консервативный подход подразумевает необходимость ожидания до тех пор, пока не возникнет уверенность, что команда загрузки прочтет правильное значение. Этот подход обычно подразумевает задержку выполнения команд загрузки внутри сегмента до тех пор, пока не завершили операции записи в память все сегменты-предшественники, результат которых может быть использован последующей командой. При агрессивном подходе загрузки из памяти в регистры ПЭ должны выполняться спекулятивно, в предположении, что сегмент-предшественник позже не будет сохранять значения в ту же самую ячейку памяти. Чтобы гарантировать, что никакой сегмент-предшественник не записывает значение в ячейку памяти, предварительно считанную сегментом-преемником, должна проводиться проверка в процессе выполнения вычислений. Если эта проверка идентифицирует загрузку и сохранение, которые находятся в противоречии (не происходят в соответствующем порядке), более поздняя единица обработки должна быть прервана, и должна быть инициализирована соответствующая процедура восстановления. В мультитредовых процессорах используется агрессивный подход.
Из-за спекулятивного характера мультитредовое выполнение должно иметь как средства подтверждения правильности выполнения, так и средства исправления в случае неправильного выполнения. Выполнение команд внутри сегмента может рассматриваться как спекулятивное с двух точек зрения: как спекулятивное по управлению, и как спекулятивное по данным. Если в результате спекулятивного управления предсказание следующего сегмента оказалось неверным, то следующий сегмент (сегменты) должен быть отменен и восстановлена правильная последовательность сегментов. Аналогично сегмент, использующий неправильные данные, должен быть отменен, и должно быть восстановлено правильное значение данных. В любом случае отмена сегмента приводит к отмене всех сегментов, выполняемых после отмененного (иначе поддержание последовательной семантики оказывается сложным).
Для упрощения сохранения последовательной семантики исполнения программы мультитредовый процессор удаляет сегменты из циклической очереди в том же порядке, в каком их помещал в очередь. В процессе спекулятивного выполнения сегмент производит значения, которые могут быть как правильными, так и неправильными. Только, безусловно, правильные результаты сегмента могут быть безопасно использованы другими сегментами. Тем не менее, в мультитредовом процессоре значения оптимистично посылаются для спекулятивного использования в ходе выполнения других сегментов. Поскольку сегмент посылает значения предварительно другим сегментам, как только их вырабатывает, большая часть, если не все значения, будут посланы к моменту, когда сегмент становится головным в очереди. Таким образом, отмена сегмента для освобождения процессора и назначения нового сегмента может быть выполнена просто путем модифицирования указателя начала очереди.
- Предисловие
- Глава 1. Общие сведения о микропроцессорах
- 1.1 Классификация микропроцессоров
- 1.2 Характеристики микропроцессоров
- 1.2.1 Тактовая частота
- 1.2.2 Архитектура процессора
- 1.2.3 Технологический процесс производства
- 1.2.4 Частота системной шины
- 1.2.5 Размер кэша
- 1.3 Типы архитектур микропроцессоров
- 1.4 Структурная схема микропроцессоров
- 1.4.1 Микропроцессор Фон-Неймана
- 1.4.2 Конвейер
- 1.4.3 Зависимость между частотой и количеством ступеней конвейера
- 1.5 Представление информации в эвм
- 1.5.1 Двоичное представление целых чисел
- 1.5.2 Представление символьной информации
- Глава 2. Архитектура микропроцессоров ia-32
- 2.1 Состав и функции регистров
- 2.1.1 Основные регистры
- 2.1.2 Регистры дополнительных функциональных модулей
- 2.2 Типы адресации
- 2.3 Система команд
- 2.3.1 Классификация команд
- 2.3.2 Формат команды
- 2.3.3 Однобайтовые команды
- 2.3.4 Непосредственно заданные операнды
- 2.3.5 Команды с регистровыми операндами
- 2.3.7 Команды с операндами, расположенными в памяти
- Глава 3. Организация многоуровневой памяти
- 3.1 Принцип построения многоуровневой памяти
- 3.2 Организация кэш-памяти
- 3.3 Протоколы когерентности памяти микропроцессоров
- 3.4 Страничная организация памяти
- Глава 4. Режимы работы процессоров ia-32
- 4.1 Обзор режимов работы
- 4.2 Реальный режим адресации
- 4.3 Защищённый режим
- 4.3.1 Дескрипторные таблицы
- 4.3.2 Дескрипторные регистры
- 4.3.3 Дескриптор
- 4.3.4 Односегментная модель памяти
- 4.3.5 Многосегментная модель памяти
- Глава 5. Страничная организация памяти в процессорах ia‑32
- 5.1 Каталог страниц
- 5.2 Таблица страниц
- 5.3 Страничная переадресация
- 5.4 Диспетчер виртуальных машин системы Microsoft Windows
- Глава 6. Архитектура процессоров с параллелизмом уровня команд
- 6.1 Подходы к использованию ресурса транзисторов в микропроцессорах
- 6.2 Суперскалярные процессоры и процессоры с длинным командным словом
- 6.3 Зависимости между командами, препятствующие их параллельному исполнению
- 6.4 Предварительная выборка команд и предсказание переходов
- 6.5 Условное выполнение команд в vliw-процессорах
- 6.6 Декодирование команд, переименование ресурсов и диспетчеризация
- 6.7 Исполнение команд
- 6.8 Завершение выполнения команды
- 6.9 Направления развития архитектуры процессоров с параллелизмом уровня команд
- Глава 7. Мультитредовые микропроцессоры
- 7.1 Основы мультитредовой архитектуры
- 7.2 Выявление тредов
- 7.3 Мультитредовые процессоры с тредами, выявляемыми путем анализа потоков управления программы
- 7.3.1 Мультитредовая модель выполнения программы
- 7.3.2 Мультитредовые программы
- 7.3.3 Аппаратные средства мультитредовой архитектуры
- 7.3.4 Преимущества мультитредовой архитектуры
- 7.4 Мультитредовые процессоры с тредами, выявляемыми путем анализа потоков данных программы
- 7.5 Специфика мультитредовых моделей распараллеливания
- Глава 8. Модуль обработки вещественных чисел
- 8.1 Представление чисел с плавающей запятой
- 8.2 Состав модуля fpu
- Глава 9. Основы 64-разрядной архитектуры
- 9.1 Состав и назначение регистров микропроцессора ia-64
- 9.2 Особенности архитектуры epic
- 9.3 Архитектура x86-64
- 9.4 Структура одноядерного процессора
- 9.5 Многоядерные процессоры
- 9.6 Зачем нужны “лишние” разряды?
- Глава 10. Современные 64-разрядные микропроцессоры корпораций Intel и amd
- 10.1 Архитектура Intel Core 2
- 10.1.1 Intel Wide Dynamic Execution
- 10.1.2 Intel Intelligent Power Capability
- 10.1.3 Intel Advanced Smart Cache
- 10.1.4 Intel Smart Memory Access
- 10.1.5 Intel Advanced Digital Media Boost
- 10.1.6 Логическая схема процессора
- 10.2 Архитектура Intel Core i7
- 10.2.1 Технология Hyper-Threading в архитектуре Nehalem
- 10.2.2 Иерархия кэш-памяти в архитектуре Nehalem
- 10.3 Хронология развития семейств микропроцессоров с архитектурой Nehalem
- 10.4 Архитектура amd Athlon 64
- 10.4.1 Ядро процессора
- 10.4.3 Контроллер памяти
- 10.4.4 Контроллер HyperTransport
- 10.5 Архитектура amd k10
- 10.4.1 Технология amd Memory Optimizer Technology
- 10.5.2 Ядро процессора
- 10.5.3 Предвыборка данных и инструкций
- 10.5.4 Выборка из кэша
- 10.5.5 Предсказание переходов и ветвлений
- 10.5.6 Процесс декодирования
- 10.5.7 Диспетчеризация и переупорядочение микроопераций
- 10.5.8 Выполнение микроопераций
- 10.5.9 Технологии энергосбережения
- 10.5.10 Шина HyperTransport 3.0
- 10.5.11 Семейство процессоров Barcelona
- 10.5.12 Семейство процессоров Phenom
- Глава 11. Технологии, поддерживаемые современными микропроцессорами
- 11.1 Технологии тепловой защиты
- 11.1.1 Технология Thermal Monitor
- 11.1.2 Технология Thermal Monitor 2
- 11.1.3 Режим аварийного отключения
- 11.2 Технологии энергосбережения
- 11.2.1 Технология Enhanced Intel SpeedStep
- 11.2.2 Технология Cool'n'Quiet
- 11.3 Технология расширенной памяти
- 11.4 Технология антивирусной защиты
- 11.5 Технология виртуализации
- 11.6 Реализация технологий в современных микроархитектурах
- 11.6.2 Em64t – NetBurst
- 11.6.3 Intel Core
- 11.6.4 Intel Atom
- 11.6.5 Nehalem
- 11.6.6 Xeon
- Глава 12. Графические микропроцессоры
- 12.1 Основные термины и определения
- 12.2 Технологии построения трёхмерного изображения
- 12.2.1 Технологии повышения реалистичности трехмерного изображения
- 12.3 Шейдерный процессор
- 12.4 Особенности современных графических процессоров
- Глава 13. Однокристальные микроконтроллеры
- 13.1 Общая характеристика микроконтроллеров
- 13.2 Микроконтроллеры семейства avr
- Почему именно avr?
- 13.3 Общие сведения об омк avr
- 13.4 Характеристики avr-микроконтроллеров
- Глава 14. Технология производства микропроцессоров
- 14.1 Особенности производства процессоров
- 14.2 Новые технологические решения
- 14.3 Технология производства сверхбольших интегральных схем
- I. Выращивание кристалла кремния
- II. Создание проводящих областей
- III. Тестирование
- IV. Изготовление корпуса
- V. Доставка
- 14.4 Перспективы производства сбис
- Англо-русский словарь терминов и аббревиатур
- Библиографический список
- Интернет-ссылки
- 350072. Краснодар, ул. Московская, 2, кор. А.