1.3.4 Конвейерная реализация команд, параллельность на уровне команд, динамическая синхронизация

iDevice ikoon 1.3.4 Конвейерная реализация команд, параллельность на уровне команд, динамическая синхронизация

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

Для эффективного использования различных частей процессора с целью увеличения его производительности применяют принцип конвейерной обработки команд (Instruction Pipelining), когда выполнение команд подразделяется на ряд этапов, каждый из которых выполняется определённой частью процессора. Идея заключается в том, чтобы начинать выполнение командой очередного этапа сразу, как только предыдущая команда этот этап закончит (и соответствующая часть процессора освободится). Например, начинать этап считывания команды из памяти, как только предыдущая команда его закончит и приступит к этапу декодирования команды. Конвейер отлично работает, если команды не зависимы одна от другой (т. е. для выполнения одной команды не используются результаты другой). Если такая зависимость имеется, то конвейерную обработку команды приходиться приостанавливать, чтобы дождаться необходимых результатов выполнения предыдущей команды. Приостановка конвейера происходит и в случае, например, когда встретится команда выполняющая сложнную операцию с плавающей точкой, выполнение которой присходит в специальном устройстве и занимает несколько процессорных тактов. Чтобы избежать такую ситуацию, в современных процессорах имеется несколько конвейеров, предназначенных для разных типов команд.


Параллельность на уровне команд (ILP - Instruction Level Parallelism) есть термин, который указывает на возможность выполнения нескольких команд в процессоре одновременно, если у них нет взаимной зависимости от результатов выполнения. Например, если из трёх команд у двух нет зависимости от результатов работы третьей, то можно выполнять эти три команды в один отрезок времени, что приводит показатель параллельности на уровне комад к значению ILP=3/2.

Имеется две возможности увеличения ILP:

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

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

  В свою очередь суперскалярная архитектура может применяться по-разному:

  • с независимыми конвейерами: каждое отдельное функциональное устройство (блок) принадлежит определённому конвейеру
  • с частично перекрываемыми конвейерами: для экономии ресурсов функциональных блоков некоторые функциональные устройства являются общими для нескольких конвейеров.

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


Возможные технологии для избежания простоев конвейеров:

  • Динамическая синхронизация (Dynamic Sceduling), в случае которой аппаратура реорганизует программный код так, чтобы чтобы уменьшить простои конвейеров. Эта технология позволяет разрешить случаи, когда взаимозависимость процессорных команд не известна. При этом она упрощает процесс компиляции и позволяет программный код, написанный для использования одного конвейера эффективно запускать на нескольких конвейерах.
  • Спекулятивная синхронизация (Speculative Execution), когда при наличии свободных ресурсов выполняются коды, хотя и не известно потребуются ли результаты их выполнения (т. е. команды выполняются на опережение, заранее). Напрмер, это можно делать при выполнении команд условного перехода (при этом заранее выполняются команды по обеим ветвям возможного перехода). Этот метод позволяет использовать простаивающие ресурсы.