Введение
В информатике, программный конвейер — это техника, используемая для оптимизации циклов, аналогично аппаратному конвейеру. Программный конвейер является разновидностью внеочередного выполнения, за исключением того, что переупорядочивание выполняется компилятором (или, в случае ручного ассемблерного кода, программистом), а не процессором. Некоторые компьютерные архитектуры имеют встроенную поддержку программного конвейера, в частности, архитектура Intel IA-64. Важно различать программный конвейер, как технику целевого кода для перекрытия итераций цикла, и модульное планирование — наиболее эффективный известный метод компиляции для генерации программных конвейерных циклов. Программный конвейер был известен программистам на ассемблере машин с параллелизмом на уровне инструкций с момента появления таких архитектур. Эффективная генерация такого кода компилятором началась с изобретения модульного планирования Рау и Глазером. Лам показала, что для эффективного модульного планирования не требуется специальное аппаратное обеспечение. Ее метод, модульное расширение переменных, широко используется на практике. Гао и др. сформулировали оптимальный программный конвейер в задачах целочисленного линейного программирования, что привело к проверке продвинутых эвристик в оценочной работе. В этой статье представлен хороший список литературы по данной теме.
good set of references on the topic.
Внедрение ИА-64
Архитектура Intel IA-64 представляет собой пример архитектуры, разработанной с учетом сложностей программного конвейерирования. Некоторые из архитектурных средств поддержки программного конвейерирования включают в себя: "вращающийся" банк регистров, где инструкции могут обращаться к номеру регистра, который перенаправляется на другой регистр на каждой итерации цикла (в конечном итоге возвращаясь к началу). Это делает дополнительные инструкции, вставленные в предыдущем примере, излишними. Предикаты (используемые для "предикации" инструкций; см. Предикация переходов), которые получают свое значение из специальных инструкций цикла. Эти предикаты включают или отключают определенные инструкции в цикле, что устраняет необходимость в отдельном прологе и эпилоге.
A "rotating" register bank; instructions can refer to a register number that is redirected to a different register each iteration of the loop (eventually looping back around to the beginning). This makes the extra instructions inserted in the previous example unnecessary. Predicates (used to "predicate" instructions; see Branch predication) that take their value from special looping instructions. These predicates turn on or off certain instructions in the loop, making a separate prologue and epilogue unnecessary.