6

# Тема 6. Обработка данных

Цель: Рассмотреть простейшую организацию конвейера и выполнить оценку его производительности.

План:

1. Простейшая организация конвейера и оценка его производительности.

2. Основные этапы обработки данных.

1. Простейшая организация конвейера и оценка его производительности

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

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

Архитектура машин с длинным командным словом

Архитектура машин с очень длинным командным словом (VLIW - Very Long Instruction Word) позволяет сократить объем оборудования, требуемого для реализации параллельной выдачи нескольких команд, и потенциально чем большее количество команд выдается параллельно, тем больше эта экономия. Например, суперскалярная машина, обеспечивающая параллельную выдачу двух команд, требует параллельного анализа двух кодов операций, шести полей номеров регистров, а также того, чтобы динамически анализировалась возможность выдачи одной или двух команд и выполнялось распределение этих команд по функциональным устройствам. Хотя требования по объему аппаратуры для параллельной выдачи двух команд остаются достаточно умеренными, и можно даже увеличить степень распараллеливания до четырех (что применяется в современных микропроцессорах), дальнейшее увеличение количества выдаваемых параллельно для выполнения команд приводит к нарастанию сложности реализации из-за необходимости определения порядка следования команд и существующих между ними зависимостей.

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

Аппаратные средства большой степени распараллеливания

Методы, подобные разворачиванию циклов и планированию трасс, могут использоваться для увеличения степени доступного параллелизма, когда поведение условных переходов достаточно предсказуемо во время компиляции. Если же поведение переходов не известно, одной техники компиляторов может оказаться не достаточно для выявления большей степени параллелизма уровня команд. В этом разделе представлены два метода, которые могут помочь преодолеть подобные ограничения. Первый метод заключается в расширении набора команд условными или предикатными командами. Такие команды могут использоваться для ликвидации условных переходов и помогают компилятору перемещать команды через точки условных переходов. Условные команды увеличивают степень параллелизма уровня команд, но имеют существенные ограничения. Для использования большей степени параллелизма разработчики исследовали идею, которая называется "выполнением по предположению" (speculation), и позволяет выполнить команду еще до того, как процессор узнает, что она должна выполняться (т.е. этот метод позволяет избежать приостановок конвейера, связанных с зависимостями по управлению).

2. Основные этапы обработки данных

В основе архитектуры любого процессора есть несколько конструктивных элементов: кэш команд и данных, предпроцессор (Front End) и постпроцессор, называемый также блоком исполнения команд (Execution Engine.).

Рисунок 7.1 - Конструктивная схема конвейерной обработки «классического» процессора

Процесс обработки данных состоит из нескольких характерных этапов. Прежде всего инструкции и данные забираются из кэша L1 (который разделен на кэш данных и кэш инструкций). Эта процедура называется выборкой. После этого выбранные из кэша инструкции декодируются в понятные для данного процессора примитивы (машинные команды). Данная процедура называется декодированием. Далее декодированные команды поступают на исполнительные блоки процессора, выполняются, а результат записывается в оперативную память (см. рисунок 7.1).

Процессы выборки инструкций из кэша, их декодирование и продвижение к исполнительным блокам осуществляются в предпроцессоре, а процесс выполнения декодированных команд — в постпроцессоре. Таким образом, даже в самом простейшем случае команда проходит как минимум четыре стадии обработки:

· выборка из кэша;

· декодирование;

· выполнение;

· запись результатов.

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

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

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

Существует два принципиально различных подхода к повышению производительности процессора (не считая, конечно, увеличения тактовой частоты). Суть первого заключается в том, чтобы за счет уменьшения длины конвейера увеличивать количество исполнительных блоков. Таким образом, по существу реализуется множество параллельных коротких конвейеров. При этом постпроцессор работает по классической схеме: осуществляет выборку команд, их декодирование и посылку на множество исполнительных блоков. Такой подход позволяет в полной мере реализовать параллелизм на уровне инструкций (Instruction-Level Parallelism, ILP), когда несколько инструкций выполняются одновременно в различных исполнительных блоках процессора. Важно, что количество ступеней конвейера внутри постпроцессора (исполнительного блока) здесь невелико, поэтому инструкции выполняются за небольшое количество циклов.

Для того чтобы реализовать параллелизм на уровне инструкций, необходимо, чтобы поступающие на исполнительные блоки команды можно было выполнять параллельно. Однако если, к примеру, для выполнения следующей по порядку инструкции требуется знать результат выполнения предыдущей инструкции (взаимозависимые инструкции), то в этом случае параллельное выполнение невозможно. Поэтому препроцессор прежде всего проверяет взаимозависимость команд и переупорядочивает их не в порядке поступления (out of order), а так, чтобы их можно было выполнять параллельно. На последних ступенях конвейера инструкции выстраиваются в исходном порядке.

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

При использовании длинного конвейера возможно увеличение тактовой частоты процессора, то есть сам конвейер оказывается более быстрым. Использование длинных конвейеров с высокими тактовыми частотами процессора — это второй подход к увеличению производительности процессора. Именно такая идеология длинного конвейера заложена в архитектуре процессора Intel Pentium 4. При использовании длинного конвейера в постпроцессоре, то есть на стадии исполнения инструкций, задействуется меньшее количество исполнительных блоков, каждый из которых обладает длинным и соответственно быстрым конвейером. Это означает, что каждый блок исполнения (Execution Unit) имеет больше доступных для выполнения тактов и способен одновременно выполнять довольно много инструкций. К примеру, вместо трех устройств для выполнения операций с вещественными числами (FPU), имеющих короткий конвейер, у процессора может быть только один блок FPU с длинным конвейером, на различных ступенях которого может одновременно выполняться большее количество инструкций.

Как мы уже отмечали, длинный конвейер имеет свои сложности. Дело в том, что в случае длинного конвейера постпроцессора предпроцессору необходимо обеспечивать его соответствующую загрузку. Для этого предпроцессор должен обладать довольно большим буфером, способным вмещать достаточное количество инструкций. Если же в кэше L1 отсутствует инструкция или данные для конвейера, то образуются так называемые pipeline bubbles (конвейерные пузырьки). Такие pipeline bubbles проходят все ступени конвейера, ни на одной из которых не производятся никакие действия. Наличие таких pipeline bubbles негативно отражается на производительности процессора, поскольку ресурсы процессора просто-напросто простаивают. Избежать возникновения подобных нежелательных простоев в процессорах позволяют различные хитроумные алгоритмы.

Литература: 6, стр. 11-27; 1, стр. 259-263.

Контрольные вопросы

1. Объясните метод проектирования «Совмещение операций».

2. На чем основе чего реализована конвейеризация?

3. Что позволяет сделать архитектура машин с очень длинным командным словом?

4. Что означает "выполнением по предположению"?

5. Какие конструктивные элементы имеются в архитектуре любого процессора?

6. Какие этапы входят в процесс обработки?

7. Какие подходы существуют для повышения производительности?

8. Что необходимо для реализации параллелизма на уровне инструкций?

9. Почему образуются конвейерные пузырьки?