1. Параллелизм на уровне команд. Суперскалярный процессор, VLIW-процессор.

Параллелизм уровня команд (Instruction Level Parallelism, ILP) – это потенциальное перекрытие нескольких инструкций во времени. Благодаря ILP такие инструкции могут выполняться параллельно, повышая производительность.

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

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

Простейший способ увеличения ILP – использование параллелизма итераций цикла. Разворачивание циклов (Loop Unrolling) – увеличение числа инструкций базового блока (копирование тела цикла несколько раз).

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

Зависимость – свойство программы.
Конфликт, возникший (или не возникший) из зависимости – свойство организации архитектуры.

Существует 3 типа зависимостей:

Зависимости по данным

Зависимость по данным возникает, в случаях:

  1. Инструкция i создает результат, используемый инструкцией j.
  2. Команда 2 зависит по данным от какой-либо команды 3, которая в свою очередь является зависимой по данным от команды 1.

Зависимости по именам

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

Виды:

  1. Антизависимость – возникает, если команда_2 записывает в ячейку памяти, которую команда_1 считывает, и команда_1 выполняется первой.
  2. Зависимость по выходу – возникает, когда команда_1 и команда_2 пишут результат в одну и ту же ячейку памяти. Порядок выполнения этих команд должен сохраняться.

Переименование регистров – одна из техник для преодоления таких зависимостей.

Зависимости по управлению

Зависимости по управлению определяют порядок выполнения команд по отношению к команде условного перехода.

Имеются два ограничения, связанные с зависимостями по управлению:

  1. Зависящая по управлению команда, не может быть в результате перемещения поставлена перед командой условного перехода, стать независимой от него.
  2. Команда, не зависимая по управлению от команды условного перехода, не может быть поставлена после команды условного перехода так, что её выполнение станет управляться этим условным переходом.

Критической задачей при использовании ILP является сохранение корректности программы. Для этого необходимо поддерживать два свойства: поведение при исключениях и поток данных. Поведение при исключенияхподразумевает, что никакие перестановки команд не должны влиять на то, как выбрасывается исключение, на его семантику. Поток данных – это поток значений, порождаемый и потребляемый инструкциями. Для его поддержания нужно обеспечить сохранение зависимостей по данным и по управлению. ILP может выявляться компилятором и аппаратно. На широком использовании ILP базируются суперскалярные и VLIW-архитектуры.

Низкоуровневый параллелизм достигается, в частности, выдачей (issue) нескольких команд за один тактовый цикл. Процессоры, в которых реализуется этот принцип, делятся на две категории: суперскалярные и VLIW (Very Long Instruction Word – процессоры со сверхдлинным словом).

Суперскалярные процессоры способны за один такт вызывать для выполнения несколько команд (обычно от 2 до 6), что определяется как аппаратной реализацией, так и последовательностью команд.

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

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

В современных VLIW-системах предусматривается механизм маркировки связи команд для того, чтобы процессор мог выбрать и запустить связку. Задача по подготовке и завершению связок выполняется компилятором. Таким образом в VLIW-системах решение проблем совместимости переносится со стадии исполнения на стадию компиляции.
Преимущества такого подхода:

Суперскалярные:

VLIW: