Конвейерната обработка на инструкциите
Конвейерната обработка на инструкциите е техника, използвана при проектирането на съвременни микропроцесори, микроконтролери и централни процесори, за да се увеличи тяхната производителност (броят на инструкциите, които могат да бъдат изпълнени за единица време).
Основната идея е обработката на дадена инструкция на процесора, определена от микрокода на инструкцията, да бъде разделена (наречена "split") на поредица от независими стъпки от микрооперации (наричани още "микроинструкции", "микрооперации" или "µop"), като в края на всяка стъпка се извършва съхранение. Това позволява на логиката за управление на процесорите да обработва инструкциите със скоростта на обработка на най-бавната стъпка, която е много по-бърза от времето, необходимо за обработка на инструкцията като единична стъпка.
Терминът "тръбопровод" се отнася до факта, че всяка стъпка носи една микроинструкция (като капка вода) и всяка стъпка е свързана с друга стъпка (аналогия; подобно на водопроводни тръби).
Повечето съвременни централни процесори се управляват от тактов генератор. Процесорът се състои от вътрешна логика и памет (флип флопове). Когато сигналът на часовника пристигне, флип флоповете съхраняват новата си стойност, след което логиката се нуждае от определен период от време, за да декодира новите стойности на флип флоповете. След това пристига следващият тактов импулс и флиповете съхраняват други стойности и т.н. Чрез разделяне на логиката на по-малки части и вмъкване на флип флопове между частите на логиката се намалява времето, необходимо на логиката (за декодиране на стойностите до генериране на валидни изходи в зависимост от тези стойности). По този начин може да се намали тактовият период.
Например RISC конвейерът се разделя на пет етапа с набор от флип флопове между всеки етап, както следва:
- Извличане на инструкции
- Декодиране на инструкции и извличане на регистър
- Изпълнение на
- Достъп до паметта
- Връщане на регистъра
Процесорите с конвейерно свързване се състоят вътрешно от етапи (модули), които могат да работят полунезависимо върху отделни микроинструкции. Всеки етап е свързан чрез флип флопове със следващия етап (като "верига"), така че изходът на етапа е вход за друг етап, докато работата по обработката на инструкциите не приключи. Такава организация на вътрешните модули на процесора намалява общото време за обработка на инструкциите.
Нелинейната архитектура не е толкова ефективна, тъй като някои модули на процесора не работят, докато друг модул е активен по време на цикъла на инструкциите. Конвейерната архитектура не премахва напълно времето на престой в конвейерния процесор, но работата на процесорните модули в паралел увеличава пропускателната способност на инструкциите.
Счита се, че конвейерът за инструкции е напълно конвейерен, ако може да приема нови инструкции на всеки тактов цикъл. Конвейер, който не е напълно конвейерен, има цикли на изчакване, които забавят напредъка на конвейера.
![Основен петстепенен конвейер в RISC машина (IF = извличане на инструкция, ID = декодиране на инструкция, EX = изпълнение, MEM = достъп до паметта, WB = запис в регистър). Вертикалната ос е последователните инструкции, а хоризонталната ос е времето. Така че в зелената колона най-ранната инструкция е на етап WB, а последната инструкция е в процес на извличане на инструкции.](https://alegsaonline.com/image/400px-Fivestagespipeline.png)
![Zoom](https://www.alegsaonline.com/zoom.png)
Основен петстепенен конвейер в RISC машина (IF = извличане на инструкция, ID = декодиране на инструкция, EX = изпълнение, MEM = достъп до паметта, WB = запис в регистър). Вертикалната ос е последователните инструкции, а хоризонталната ос е времето. Така че в зелената колона най-ранната инструкция е на етап WB, а последната инструкция е в процес на извличане на инструкции.
Предимства и недостатъци на конвейерната обработка
Предимства на Pipelining:
- Времето на цикъла на процесора се намалява, което увеличава производителността на инструкциите. Конвейерното свързване не намалява времето, необходимо за изпълнение на една инструкция; вместо това то увеличава броя на инструкциите, които могат да бъдат обработени едновременно ("наведнъж"), и намалява забавянето между завършените инструкции (наричано "пропускателна способност").
Колкото повече етапи на конвейера има един процесор, толкова повече инструкции може да обработва "едновременно" и толкова по-малко е забавянето между завършените инструкции. Всеки преобладаващ микропроцесор с общо предназначение, произвеждан днес, използва най-малко 2 етапа на конвейера до 30 или 40 етапа. - Ако се използва конвейерно свързване, аритметичният логически блок на процесора може да се проектира по-бързо, но ще бъде по-сложен.
- Теоретично конвейерното свързване увеличава производителността в сравнение с неконвейерно ядро с коефициент на броя на етапите (ако приемем, че тактовата честота също се увеличава със същия коефициент) и кодът е идеален за конвейерно изпълнение.
- Процесорите с конвейерно свързване обикновено работят с по-висока тактова честота от тактовата честота на оперативната памет (от 2008 г. насам оперативната памет работи с по-ниска честота в сравнение с честотата на процесорите), което увеличава общата производителност на компютрите.
Недостатъци на Pipelining:
Конвейерната подредба има много недостатъци, въпреки че има много техники, използвани от процесорите и компилаторите за преодоляване на повечето от тях; по-долу е даден списък на често срещаните недостатъци:
- Конструкцията на непипелиран процесор е по-проста и по-евтина за производство, като непипелираният процесор изпълнява само една инструкция в даден момент. Това предотвратява забавянето на разклоненията (при Pipelining всяко разклонение се забавя), както и проблеми при едновременно изпълнение на серийни инструкции.
- В конвейерния процесор вмъкването на флип флопове между модулите увеличава латентността на инструкциите в сравнение с неконвейерния процесор.
- Един непипелиран процесор има определена производителност на инструкциите. Производителността на един конвейерен процесор е много по-трудна за прогнозиране и може да варира в широки граници за различни програми.
- Много проекти включват конвейери с дължина 7, 10, 20, 31 и дори повече етапа; недостатък на дългия конвейер е, че когато програмата се разклонява, целият конвейер трябва да се промие (изчисти). По-голямата производителност на конвейерите е недостатъчна, когато изпълняваният код съдържа много разклонения: процесорът не може да знае предварително къде да прочете следващата инструкция и трябва да изчака завършването на инструкцията за разклонение, оставяйки конвейера зад нея празен. Този недостатък може да бъде намален, като се предвиди дали условната инструкция за разклоняване ще се разклони въз основа на предишна дейност. След като разклонението бъде разрешено, следващата инструкция трябва да измине целия път през конвейера, преди резултатът от нея да стане достъпен и процесорът да продължи отново да "работи". В такива екстремни случаи производителността на конвейерния процесор може да бъде по-лоша от тази на неконвейерния процесор.
- За съжаление не всички инструкции са независими. В един прост конвейер завършването на една инструкция може да изисква 5 етапа. За да работи с пълна производителност, този конвейер ще трябва да изпълни 4 последователни независими инструкции, докато първата се завършва. Всяка от тези 4 инструкции може да зависи от изхода на първата инструкция, което ще накара логиката за управление на конвейера да изчака и да вкара в конвейера прекъсване или загубен тактов цикъл, докато зависимостта бъде разрешена. За щастие, техники като препращане могат значително да намалят случаите, в които се налага прекъсване.
- Самомодифициращите се програми може да не успеят да се изпълнят правилно на конвейерна архитектура, когато модифицираните инструкции са близо до изпълняваните инструкции. Това може да се дължи на факта, че инструкциите вече са в опашката за предварително извличане на данни (Prefetch Input Queue), така че модификацията може да не влезе в сила за предстоящото изпълнение на инструкциите. Кешовете за инструкции влошават още повече проблема.
- Опасности: Когато програмистът (или компилаторът) пише код на асемблер, той обикновено приема, че всяка инструкция се изпълнява преди изпълнението на следващата. Когато това предположение не е потвърдено чрез конвейер, то води до неправилно поведение на програмата, като ситуацията е известна като опасност. Съществуват
различни техники за разрешаване на опасностите или заобикаляне, като например пренасочване и забавяне (чрез вмъкване на прекъсване или загуба на тактов цикъл).
Примери
Общ тръбопровод
Вдясно е показан общ тръбопровод с четири етапа:
- Извлечете
- Декодиране на
- Изпълнение на
- Записване обратно
В горната сива кутия е списъкът с инструкции, които чакат да бъдат изпълнени; в долната сива кутия е списъкът с инструкции, които са завършени; а в средната бяла кутия е конвейерът.
Изпълнението е следното:
Време | Изпълнение |
0 | Четири инструкции очакват да бъдат изпълнени |
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | Изпълняват се всички инструкции |
Bubble
Когато възникне "хълцане" (прекъсване) в изпълнението, в конвейера се създава "балон", в който не се случва нищо полезно. В цикъл 2 извличането на лилавата инструкция се забавя и етапът на декодиране в цикъл 3 вече съдържа "балон". Всичко зад лилавата инструкция също се забавя, но всичко пред лилавата инструкция продължава да се изпълнява.
Ясно е, че в сравнение с изпълнението по-горе, балонът дава общо време за изпълнение от 8 тактови часа вместо 7.
Бабълите са нещо като застой (забавяне), при който не се случва нищо полезно за извличането, декодирането, изпълнението и обратния запис. Това е като код NOP (съкращение от No OPeration).
Пример 1
Типична инструкция за събиране на две числа може да бъде ADD A, B, C
, която събира стойностите, намиращи се в местата в паметта A и B, и след това поставя резултата в място в паметта C. В конвейерен процесор конвейерният контролер ще разбие това на поредица от задачи, подобни на:
Местата 'R1' и 'R2' са регистри в процесора. Стойностите, съхранени в местата в паметта, обозначени като "A" и "B", се зареждат (копират) в тези регистри, след което се сумират и резултатът се съхранява в място в паметта, обозначено като "C".
В този пример конвейерът се състои от три етапа - зареждане, изпълнение и съхранение. Всеки от етапите се нарича етап на конвейера.
В непипелиран процесор може да работи само един етап в даден момент, така че цялата инструкция трябва да приключи, преди да започне следващата инструкция. При конвейерния процесор всички етапи могат да работят едновременно върху различни инструкции. Така че, когато тази инструкция е на етап изпълнение, втора инструкция ще бъде на етап декодиране, а трета инструкция ще бъде на етап извличане.
Пример 2
За да разберем по-добре концепцията, можем да разгледаме един теоретичен триетапен тръбопровод:
Етап | Описание |
Зареждане | Инструкция за четене от паметта |
Изпълнение на | Изпълнение на инструкция |
Магазин | Съхраняване на резултата в паметта и/или регистрите |
и псевдокод на асемблито, който трябва да бъде изпълнен:
Това е начинът, по който ще бъде изпълнена:
Часовник 1 | ||
Зареждане | Изпълнение на | Магазин |
ЗАРЕЖДАНЕ |
|
|
Инструкцията LOAD се извлича от паметта.
Часовник 2 | ||
Зареждане | Изпълнение на | Магазин |
MOVE | ЗАРЕЖДАНЕ |
|
Изпълнява се инструкцията LOAD, а инструкцията MOVE се извлича от паметта.
Часовник 3 | ||
Зареждане | Изпълнение на | Магазин |
ADD | MOVE | ЗАРЕЖДАНЕ |
Инструкцията LOAD е в етап Store, където резултатът от нея (числото 40) ще бъде съхранен в регистър A. Междувременно се изпълнява инструкцията MOVE. Тъй като тя трябва да премести съдържанието на A в B, тя трябва да изчака края на инструкцията LOAD.
Часовник 4 | ||
Зареждане | Изпълнение на | Магазин |
МАГАЗИН | ADD | MOVE |
Инструкцията STORE се зарежда, докато инструкцията MOVE приключва, а инструкцията ADD се изчислява.
И така нататък. Обърнете внимание, че понякога дадена инструкция зависи от резултата на друга инструкция (като примера с MOVE). Когато повече от една инструкция се позовава на определено място за операнд, като го чете (като вход) или записва (като изход), изпълнението на тези инструкции в ред, различен от първоначалния ред на програмата, може да доведе до ситуация на опасност (спомената по-горе).
![Общ 4-етапен конвейер; цветните квадратчета представляват независими една от друга инструкции](https://alegsaonline.com/image/Pipeline,_4_stage.svg.png)
![Zoom](https://www.alegsaonline.com/zoom.png)
Общ 4-етапен конвейер; цветните квадратчета представляват независими една от друга инструкции
![Балон в цикъл 3 забавя изпълнението](https://alegsaonline.com/image/375px-Pipeline,_4_stage_with_bubble.svg.png)
![Zoom](https://www.alegsaonline.com/zoom.png)
Балон в цикъл 3 забавя изпълнението
Свързани страници
- Тръбопровод (изчислителна техника)
- Паралелни изчисления
- Паралелизъм на ниво инструкция
Въпроси и отговори
Въпрос: Какво представлява конвейерната обработка на инструкциите?
О: Конвейерната обработка на инструкциите е техника, използвана при проектирането на съвременни микропроцесори, микроконтролери и централни процесори за увеличаване на производителността на инструкциите чрез разделяне на обработката на дадена инструкция на серия от независими стъпки със съхранение в края на всяка стъпка.
Въпрос: Как работи конвейерната обработка?
О: Конвейерната обработка работи чрез разделяне на логиката на по-малки части и вмъкване на флип флопове между частите на логиката, което намалява времето, необходимо на логиката да декодира стойности, докато генерира валидни изходи в зависимост от тези стойности. Това позволява по-бързи тактови периоди.
В: Какви са някои примери за конвейери?
О: Пример за конвейер е RISC конвейерът, който е разделен на пет етапа с набор от флип флопове между всеки етап.
Въпрос: Как конвейерът увеличава пропускателната способност на инструкциите?
О.: Конвейерът увеличава пропускателната способност на инструкциите, като позволява на процесорните модули да работят паралелно, което намалява времето на престой по време на цикъла на инструкциите и увеличава общото време за обработка.
В: Всеки конвейер ли е напълно конвейерен?
О.: Не, не всеки конвейер е напълно конвейерен; някои конвейери имат цикли на изчакване, които забавят напредъка в конвейера.