Простейший конвейер, производительность конвейера

Существует достаточно простое общеизвестное правило – чтобы выполнить некоторую работу быстрее, необходимо разделить ее между несколькими исполнителями и заставить их действовать од­новременно. Различные способы совмещения операций давно вне­дряются в архитектуру ЭВМ. При этом возможно два различных по сути подхода.

В первом случае существует несколько независимых исполни­тельных устройств, каждое из которых самостоятельно выполняет действия по обработке «своих» данных. Этот подход называется па­раллельной обработкой. Устройства могут быть полностью незави­симыми, со своей собственной программой и данными, либо не­сколько исполнительных устройств могут подчиняться общему управляющему устройству, выполняя одинаковое действие над не­сколькими копиями данных.

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

В качестве примера рассмотрим некоторый абстрактный процес­сор, имеющий типичные черты многих современных RISC-процес­соров. Основа архитектуры процессора – банк из 32 регист­ров об­щего назначения и счетчик команд. Система команд процес­сора включает типичный набор арифметических и логических ко­манд, команд с плавающей точкой, операций ветвлений. Команды имеют трехадресный формат. Данные, подлежащие обработке, должны быть предварительно размещены в регистрах процессора. Загрузка данных их памяти в регистры и запись данных в память произво­дится командами загрузки – записи. Процесс выполнения команды можно разбить на следующие независимые этапы:

1) считывание команды – IF;

2) дешифрация команды – ID;

3) вычисление адреса/выборка данных из регистров – RD;

4) выполнение команды/обращение к памяти – EX;

5) запись результата в регистр – WR.

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

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

Команда 1 Команда 2 Команда 3
IF ID RD EX WR IF ID RD EX WR IF ID RD EX WR
                             

а)

№ такта                  
Команда 1 IF ID RD EX WR        
Команда 2   IF ID RD EX WR      
Команда 3     IF ID RD EX WR    
Команда 4       IF ID RD EX WR  
Команда 5         IF ID RD EX WR

б)

Рис 25. Диаграмма работы простейшего процессора а) в неконвейерном режиме, б) с конвейеризацией

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

IF ID RD EX WR
         

Максимальная длительность у этапа выполнения – 60 нс., она и определяет минимальную длительность этапа при конвейерной об­работке. Пусть дополнительные расходы на пересылку данных из блока в блок составят 5 нс. Тогда длительность каждого этапа должна быть равной 65 нс. Длительность выполнения команды в не­конвейерном режиме составит 50 + 50 + 50 + 60 + 50 = 260 нс. В конвейерном процессоре длительность выполнения одной команды составит 65 * 5 = 325 нс., т.е. время выполнения одной команды возрастет почти в полтора раза. Однако при последовательном вы­полнении команд время, требуемое для выполнения, например, 100 команд составит 100 * 260 нс. = 26 мкс. Время выполнения тех же 100 команд на конвейере при отсутствии задержек составит 325 + (100 – 1) * 65 = 6.76 мкс (время выполнения одной команды плюс длительность завершающего этапа для 99 оставшихся команд). При большом количестве выполняемых команд, каждая команда в кон­вейерном режиме будет завершаться в среднем за 65 нс.

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

1. Структурные конфликты, которые возникают из-за конфлик­тов по ресурсам, когда аппаратные средства не могут поддерживать все возможные комбинации команд в режиме одновременного вы­полнения с совмещением.

2. Конфликты по данным, возникающие в случае, когда выпол­нение одной команды зависит от результата выполнения предыду­щей команды.

3. Конфликты по управлению, которые возникают при конвейе­ризации команд переходов и других команд, которые изме­няют значение счетчика команд.

Конфликты в конвейере приводят к необходимости приостановки выполнения команд. Обычно в простейших конвейерах, если приос­танавливается какая-либо команда, то все следующие за ней ко­манды также приостанавливаются. Команды, предшествующие при­остановленной, могут продолжать выполняться, но во время приос­тановки не выбирается ни одна новая команда.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: