Конвейерное выполнение оператора А = В + С
Рисунок 5.10. Конвейерное выполнение оператора А = В + С
Очевидно, выполнение команды ADD должно быть приостановлено до тех пор, пока не станет доступным поступающий из памяти операнд C. Дополнительной задержки выполнения команды SW не произойдет в случае применения цепей обхода для пересылки результата операции АЛУ непосредственно в регистр данных памяти для последующей записи.
Для данного простого примера компилятор никак не может улучшить ситуацию, однако в ряде более общих случаев он может реорганизовать последовательность команд так, чтобы избежать приостановок конвейера. Эта техника, называемая планированием загрузки конвейера (pipeline scheduling) или планированием потока команд (instruction scheduling), использовалась начиная с 60-х годов и стала особой областью интереса в 80-х годах, когда конвейерные машины стали более распространенными.
Пусть, например, имеется последовательность операторов: a = b + c; d = e - f;
Как сгенерировать код, не вызывающий остановок конвейера? Предполагается, что задержка загрузки из памяти составляет один такт. Ответ очевиден (Рисунок 5.11):
Неоптимизированная последовательность команд |
Оптимизированная последовательность команд |
LW Rb,b | LW Rb,b |
LW Rc,c | LW Rc,c |
ADD Ra,Rb,Rc | LW Re,e |
SW a,Ra | ADD Ra,Rb,Rc |
LW Re,e | LW Rf,f |
LW Rf,f | SW a,Ra |
SUB Rd,Re,Rf | SUB Rd,Re,Rf |
SW d,Rd | SW d,Rd |