Кіріспе
Компьютерлік ғылымда бағдарламалық құбыржол – аппараттық құбыржолдармен салыстырылатын, циклдарды оңтайландыруға қолданылатын техника. Бағдарламалық құбыржол – реттіліктен шығарылған орындалудың бір түрі, бірақ қайта реттеуді процессордың орнына компилятор (немесе қолмен жазылған құрастыру коды болған жағдайда бағдарламашы) жасайды. Кейбір компьютерлік архитектуралар бағдарламалық құбыржолды тікелей қолдайды, оның ішінде Intel-дің IA 64 архитектурасы да бар. Цикл ішіндегі қайталамаларды біріктіретін мақсатты код техникасы болып табылатын бағдарламалық құбыржолды, бағдарламалық құбыржол циклдарын жасау үшін қазіргі кездегі ең тиімді компилятор техникасы – модульдік кестелеуден ажырату маңызды. Нұсқау деңгейінде параллелизмге ие машиналардың құрастыру тіліндегі бағдарламашыларына бағдарламалық құбыржол мұндай архитектуралар пайда болғаннан бері белгілі. Мұндай кодты компилятор арқылы тиімді жасау Рау мен Глейзердің модульдік кестелеуді ойлап табуымен байланысты. Лам модульдік кестелеу үшін арнайы аппараттың қажет еместігін көрсетті. Оның әдісі, модульдік айнымалы кеңейту, практикада кеңінен қолданылады. Гао және авторлар толық сандық сызықтық бағдарламалауда оптималды бағдарламалық құбыржолды құрастырды, бұл озық эвристиканы бағалау мақаласында растауға әкелді. Бұл мақалада тақырып бойынша пайдалы сілтемелер бар.
good set of references on the topic.
IA-64 іске асыру
Intel компаниясының IA 64 архитектурасы бағдарламалық құбыржолдаудың қиындықтарын ескере отырып жобаланған архитектураның мысалы болып табылады. Бағдарламалық құбыржолдауға архитектуралық қолдаудың кейбір түрлері: "айналмалы" регистрлік банк; нұсқаулар циклдың әр итерациясында басқа регистрге қайта бағытталатын регистр нөміріне сілтеме жасай алады (әдетте циклдің басына оралып келеді). Бұл бұрынғы мысалда енгізілген қосымша нұсқауларды қажетсіз етеді. Predicates (нұсқауларды "шартты ету" үшін қолданылады; тармақталу шарты қараңыз) өз мәнін арнайы циклдық нұсқаулардан алады. Бұл предикаттар циклдегі белгілі бір нұсқауларды қосып немесе өшіріп, жеке пролог пен эпилогтың қажеттілігін жояды.
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.