Karh09 8

8. Указване адреса на прехода. Методи за намаляване броя на преходите.


страницата се нуждае от дописване/преглеждане


Формиране на адреса на прехода

Адресът на прехода се формира по 4 възможни начина:

  1. като относителен адрес спрямо програмния брояч (PC + offset);
  2. Чрез базов регистър и отместване (Rbase + displacement);
  3. Чрез задаване на абсолютен адрес (частен случай на горното при Rbase == 0);
  4. Чрез вектори.

untitled28.JPG

PC-relative

Формирането на адреса на прехода чрез програмния брояч и определено отместване от него е относителна адресация. В нея няма зададен адрес само отместването спрямо текущия. Това се нарича PC-relative адресация. Според статистиката, в 94% от случаите отместванията са на не повече от 256 байта спрямо текущата позиция, тоест достатъчно е дължината на полето на offset-a да е 8 бита. Това е най-правилният и систематичен метод(наистина така пише), но недостатъкът му е, че при фиксирана дължина на преместването не могат да се правят далечни преходи. Това го прави неуниверсален.

Rbase + displacement

При втория случай в базов регистър се държи адресът на началото на 64КВ сегмент в паметта а displacement-ът определя отместването спрямо този адрес. Това е стандартният начин за получаване на адрес на прехода. По този начин могат да се достъпват всички части на оперативната памет. Отместването е 16 бита. Базовите регистри могат да сочат към произволно място в оперативната памет, отделено за една програма. Недостатъкът на този механизъм е, че адресът на прехода не е свързан с текущия адрес и това затруднява конвейера, при достигане на етапа на изпълнение.
untitled29.JPG
В програмния брояч е заредена следващата инструкция и ако по време на изпълнение (execution) се достигне до преход, то това накъсва работата на конвейера.
При адресиране от първия тип броячът се обновява директно със offset. (т.е няма нужда да се стига до АЛУ-то, за да направи преходът).

absolute

Третият начин е чрез директно указване на адрес на преход или указване на регистър, който го съдържа. Този метод е най-бърз, тъй като новата стойност директно се записва в програмния брояч, но полето на адреса е по голямо (32 бита) и програмата не е мобилна. Това означава, че ако програмата се зареди на друг адрес в паметта, няма да работи коректно (или поне ако мястото, в/у което прескача е заредено на друго място). Затова този начин не е ефективен (дървен е).

vector

Четвъртият начин на адресация е чрез използването на специализираните векторни пространства. (няма нищо общо с алгебрата. Може да си мислите за векторното пространство като масив от указатели на различни преходи). Те започват от известен адрес в паметта. При векторните пространства от този адрес нататък следват 256 вектора по 4 байта, като адресирането се определя само първия чрез jmp x, където дължината на х е 1 байт (х е от 0 до 255). Векторът х сочи в полето на програмата. Частта от ОП, която се заема от векторното пространство. ( При Intel архитектурата то е от адресите 0х0000000 до 0х00000FF ). В тази адресация има неявни база и отместване. Базовият адрес на началото на ВП се пази в специален регистър. ВП се използва за специални нужди, например за адресиране на преходите при прекъсване. Схемата за бърза дешифрация не може да следи дали има преход при векторната система. Тя се счита за опасна, тъй като е неудобна за конвейера. Не се счита за добър начин на програмиране, предимствата й са прескачанията при прекъсванията.
Хардуерната възможност процесора да прави прескачания се нарича система за прекъсвания. Това е модификация на архитектурата на фон Нойман.

Заради конвейера казваме, че условните преходи са „убиец”. Устройството за предварително разпознаване не може да разпознае прехода, поради което инструкциите за условен преход прекъсват конвейера. Това може да се предотврати като се използва
инструкция с предикати.

Методи за намаляване броя на преходите.

Aко имаме фрагмента
if (a > 0) c = b*a; това със стандартни инструкции би изглеждало така

#0 blez r1, #2 ( Branch Less than or Equal to Zero )
#1 mul r3, r2, r1
#2 ...

Ако r1 е по-малко или равно на нула се отива директно на инструкция #2, т.е прескача се умножението
При условната инструкция blez се разкъса конвейера и целия се изчиства за да се почисти само стъпка #1

Alternative to Control: Predication - предикати
При предиката трябва да се определя процесорна променлива, която е самостоятелна и еднобитова. Но те не са адресируеми. Ако има предикати трябва всички инструкции освен от операндите си да зависят и от определен номер предикат, който ако е 1 се изпълнява инструкцията, а ако е 0 не се изпълнява. В зависимост от него се определя дали ще има действие на стъпка изпълнение, но това не нарушава конвейера.
При този метод функция от вида : if (a > 0) c = b*a; може да изглежда по един от следните два начина:
1. условни премествания

#0: mul r4, r2, r1                                
#1: cmovgt r3, r4, r1 //Conditional MOVe Greater Than zero – условно преместване ако е по-голямо от нула

Ако r1 <= 0 в r3 не отива резултатът - няма преход, нито нарушаване на конвейра.
При blez варианта умножението не се изпълнява ако не е нужно, докато при втория вариант само запазването на резултата се прескача. При по-дълги конвейри е по-добре да се направят излишни сметки (като във втория случай) само за да не се наложи изпразване на целия конвейр (защото това би било по-бавно).
2. основна предикация

#0 sgtzp  p1,r1 //Set Greater Than Zero Predicate – установи предикат по-голямо от нула
#1 mulp r3,r2,r1,p1 //MULtiply on Predicate – умножи ако предиката е верен

Първият ред зарежда в предиката p1 резултата от сравнението на r1 с нула. Вторият ред се изпълнява, само ако предикатът е 1, т.е r1 > 0.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License