Разработчики компьютеров стремятся к тому, чтобы повысить производитель¬ность своих машин. Один из способов заставить процессоры работать быстрее — повышение их тактовой частоты, однако при этом существуют некоторые техно¬логические ограничения, связанные с конкретным историческим периодом. По¬этому большинство разработчиков для повышения производительности при дан¬ной тактовой частоте процессора используют параллелизм (выполнение двух или более операций одновременно).
Существует две основные формы параллелизма: параллелизм на уровне команд и параллелизм на уровне процессоров. В первом случае параллелизм реализуется за счет запуска большого количества команд каждую секунду. Во втором случае над одним заданием работают одновременно несколько процес¬соров. Каждый подход имеет свои преимущества.
Уже много лет известно, что главным препятствием высокой скорости выполне¬ния команд является необходимость их вызова из памяти. Для разрешения этой проблемы можно вызывать команды из памяти заранее и хранить в специальном наборе регистров. Таким образом, когда требовалась определенная команда, она вызывалась прямо из буфера, а обращения к памяти не происходило.
В действительности при выборке с упреждением команда обрабатывается за два шага: сначала происходит вызов команды, а затем — ее выполнение. Еще боль¬ше продвинула эту стратегию идея конвейера. При использовании конвейера команда обрабатывается уже не за два, а за большее количество шагов, каждый из которых реализуется определенным аппаратным компонентом, причем все эти компоненты могут работать параллельно.
На рис. 2.3, а изображен конвейер из пяти блоков, которые называются сту¬пенями. Первая ступень (блок С1) вызывает команду из памяти и помещает ее в буфер, где она хранится до тех пор, пока не потребуется. Вторая ступень (блок С2) декодирует эту команду, определяя ее тип и тип ее операндов. Третья ступень (блок СЗ) определяет местонахождение операндов и вызывает их из ре¬гистров или из памяти.
Рисунок 2.3
Четвертая ступень (блок С4) выполняет команду, обычно проводя операнды через тракт данных (см. рис. 2.2). И наконец, блок С5 записывает результат об¬ратно в нужный регистр.
На рис. 2.3, б мы видим, как действует конвейер во времени. Во время цикла 1 блок С1 обрабатывает команду 1, вызывая ее из памяти. Во время цикла 2 блок С2 декодирует команду 1, в то время как блок С1 вызывает из памяти ко¬манду 2. Во время цикла 3 блок СЗ вызывает операнды для команды 1, блок С2 декодирует команду 2, а блок С1 вызывает команду 3. Во время цикла 4 блок С4 выполняет команду 1, СЗ вызывает операнды для команды 2, С2 декодирует ко¬манду 3, а С1 вызывает команду 4. Наконец, во время цикла 5 блок С5 записыва¬ет результат выполнения команды 1 обратно в регистр, тогда как другие ступени конвейера обрабатывают следующие команды.
Возвратимся к нашему конвейеру на рис. 2.3. Предположим, что время цикла у этой машины — 2 нс. Тогда для того, чтобы одна команда прошла через весь конвейер, требуется 10 нс. На первый взгляд может показаться, что такой компь¬ютер будет выполнять 100 млн. команд в секунду, в действительности же ско¬рость его работы гораздо выше. В течение каждого цикла (2 нс) завершается вы¬полнение одной новой команды, поэтому машина выполняет не 100, а 500 млн команд в секунду!
Конвейеры позволяют добиться компромисса между временем запаздывания (время выполнения одной команды) и пропускной способностью процессора (количество команд, выполняемых процессором в секунду). Если время обраще¬ния составляет Т нс, а конвейер имеет n ступеней, время запаздывания составит nТ нс.