Предвиђање гранања
У рачунарској архихектури, предвиђање гранања је дигитално коло које покушава да претпостави којим ће путем грана (тј. if-then-else структура) ићи пре него што то буде засигурно познато. Сврха предвиђања гранања је да побољша проток у проточној обради инструкција. Предвиђање гранања има кључну улогу у постизању високих ефикасних перформанси у многим микропроцесорским архихектурама за проточну обарду као што је x86.
Двосмерно гранање се обично спроводи са инструкцијом која се зове условни скок. Условни скок може да се "не узме" и да настави извршење са првом граном кода који следи одмах након условног скока - или се може "узети" и скочити на друго место у програмској меморији где је друга грана кода меморисана.
Није познато да ли ће сигурно доћи до условног скока или не, све док се услов не израчуна и условни скок не пређе у фазу извршења инструкција у проточној обради (види слику 1).
Ако не би било предвиђања гранања, процесор би морао да чека да инструкција условног скока прође фазу извршавања пре него што следећа инструкција може да уђе у фазу у проточне обраде. Предвиђање гранања покушава да избегне ово губљење времена покушавајући да погоди да ли ће до условног скока највероватније доћи или не. Грана, за коју се поретпостави да је најбоља могућа, се учита и спекулативно изврши. Ако се касније испоставило да је претпоставка била погрешна онда се спекулативно извршене или делимично извршене инструкције одбаце и проточна обрада почиње испочетка са исправним гранама, изазивајући одлагање.
Време које је изгубљено у случају промашаја предвиђања гранања једнако је броју фаза у проточној обради од донете фазе до фазе извршења. Савремени микропроцесори имају тенденцију да имају прилично дубоку проточну обраду тако да је кашњење промашаја предвиђања између 10. и 20. тактног сигнала. Што дубља проточна обрада, дужа је потреба за добро предвиђање гранања.
Први пут када условна инструкција скока наиђе, нема много информација на којима је засновано предвиђање. Али предвиђање гранања води евиденцију о томе да ли су гране узете или не. Када наиђе условни скок који је виђен неколико пута, онда он може да заснује предвиђање на основу историје. Предиктор гранања може, на пример, да препозна да ли се условни скок чешће узима или се не узима, или да се узима сваки други пут.
Предвиђање гранања није исто што и циљно предвиђање гранања. Предвиђање гранања покушава да погоди да ли ће доћи до условног скока или не. Циљ предвиђања гранања покушава да погоди мету узетог условног или безусловног скока пре него што се израчуна помоћу декодирања и извршавања саме инструкције. Предвиђање гранања и циљ предвиђања гранања се често комбинују у истом колу.
Имплементација
[уреди | уреди извор]Статично предвиђање
[уреди | уреди извор]Статичко предвиђање је најједноставнија техника предвиђања гранања, јер се не ослаа на информације о динамичкој историји кода који се извршава. Уместо тога, предвиђа исход гране само на основу инструкција гране.[1]
Ране имплементације SPARC и MIPS (две од првих комерцијалних RISC архихектура) користи један правац статичког предвиђања гранања: оне увек предвиђају да условни скок неће бити узет (неће доћи до условног скока), тако да, оне увек донесу следећу секвенцијалну инструкцију. Само онда када је грана или скок оцењен и пронађен да би се узео, показивач инструкције се поставља на не-секвенцијалну адресу.
Оба процесора оцењују гранање у фази декодирања и имају доношење информација у једном циклусу. Као резултат тога, циљно предвиђање гранања је било дугачко два циклуса, а машина ће увек донети инструкцију одмах после једне предузете гране. Обе архитектуре дефинишу слот одлагања гранања а у циљу искоришћавања ових учитаних инструкција.
Сложенији облик статичког предвиђања претпоставља да ће се узети гране које иду уназад, а гране које су напред-указујуће гране неће се узети. Назадна грана је она која има циљну адресу која је нижа од сопствене адресе. Ова техника може да помогне са предвиђањем тачности петљи, које су обично backward-pointing гране, и чешће су узете него не.
Неки процесори омогућавају да се погодак предвиђања гранања убаци у код, да каже да ли статичко предвиђање треба да се узме или не. Интел Пентиум 4 прихвата погодак предвиђања гранања, док је ова функција напуштена у каснијим процесорима.[2]
Статично предвиђање се користи као fall-back техника у неким процесорима са динамичним предвиђањем гранања, када не постоји било каква информација за коришћење динамичког предвиђања. Оба Моторола MPC7450 (G4e) и Интел Пентиум 4 користе ову технику као fall-back.[3]
Предвиђање следеће линије
[уреди | уреди извор]Бројач засићења или бимодални предсказивач је коначан аутомат са четири фазе:
- Снажно не узето
- Слабо не узето
- Слабо узето
- Снажно узето
Када је грана оцењена, одговарајући машина се ажурира. Гране које се оцењују као не узете, смањују ка фази снажно не узето, а гране оцењене као узете, расту ка фази снажно узето. Предност од двобитног бројача преко једно-битне шеме је то да условни скок мора два пута да одступа од онога што је урађено у прошлости пре предвиђања промена. На пример, условни скок затворене-петље је пре један промашак предвиђања него два.
Оригинални, не-MMX Интел Пентиум процесор користи бројач засићења, мада са несавршеном имплементацијом.[2]
На SPEC'89 ознакама, веома велики бимодални предиктори су засићени на 93,5% тачности, једном свака мапа гранања на јединствен бројач.[4]
Табела предвиђања је индексирана са инстукцијом адресних битова, тако да процесор може да донесе предвиђање за сваку инструкцију пре него што се инструкција декодира.
Прилагодљиви предвиђач са Два-нивоа
[уреди | уреди извор]Ако има три if израза у коду, трећи if израз може се узети у зависности да ли су претходна два узета или не. У таквом сценарију прилагодљиви предвиђач са два-нивоа ради ефикасније него бројач засићења.
Условни скокови који се узимају сваки други пут, или имају неки други периодични редовни шаблони, нису добро предвиђени од стане бројача засићења. Прилагодљиви предвиђач са два-нивоа памти историју последњих n појављивања гране и користи један бројач засићења за сваки од могућих 2n шаблона. Метод је илустрован на слици 3.
Узмимо на пример да је n = 2. То значи да су две последње појаве гране меморисане у 2-битном померачком регистру. Ова историја регистра гранања може имати 4 различите бинарне вредности: 00, 01, 10, и 11; где 0 значи "није узето" и 1 значи "узето“. Сада, ми правимо табелу историје шаблона са четири уноса, један за сваки од 2n = 4 могућих грана историје. Сваки унос у табелу историје шаблона садржи 2-битни бројач засићења истог типа као на слици 2. Регистар историје гранања се користи за одабир којег од 4 бројача засићености ће се користити. Ако је историја 00 онда се користи први бројач. Ако је историја 11 онда се користи последњи бројач од сва 4 бројача.
Претпоставимо, на пример, да је условни скок узет сваки трећи пут. Секвенца гране је 001001001... У овом случају, унос броја 00 у табелу шаблона историје ће ићи у фазу "снажно узети", указујући да после нуле иде један. Улаз број 01 ће ићи у фазу "снажно не узима", што указује да је после 01 долази 0. Исти је случај и са уносом броја 10, док се унос броја 11 никада не користи, јер никад постоје две узастопне јединице.
Опште правило за прилагодљиви предвиђач са два-нивоа са n-битном историјом је то што он може да предвиди сваку секвенцу понављања са било којим периодом ако су сви n-битни поднизови другачији.[2]
Предност прилагодљивог предвиђача са два-нивоа је што може брзо да научи да предвиди произвољан шаблон понављања. Овај метод је измислио T.-Y. Yeh и Yale Patt на Универзитету у Мичигену.[5] Од првобитног објављивања 1991, овај метод је постао веома популаран. Варијанте овог метода предвиђања се користе данас у већини савремених микропроцесора.
Локално предвиђање гранања
[уреди | уреди извор]Локално предвиђање гранања има посебан бафер за историју за сваки условни скок инструкција. Он може да користи прилагодљиви предвиђач са два-нивоа. Бафер за историју је посебан за сваки условни скок инструкција, док табела историје шаблон може бити одвојена или може да се дели између свих условних скокова.
Интел Pentium MMX, Pentium II и Pentium III имају локално предвиђање гранања са локалном 4-битном историјом и табелу историје локалног шаблона са 16 уноса за сваки условни скок.
На SPEC'89 ознакама, веома велика локална предвиђања су засићена на 97,1% тачности.[6]
Глобално предвиђање гранања
[уреди | уреди извор]Глобално предвиђање гранања не води посебну евиденцију историје за сваки условни скок. Уместо тога држи заједничку историју свих условних скокова. Предност заједничке историје јесте да је било која корелација између различитих условних скокова део прављења предвиђања. Недостатак је да се историја стапа са небитним информацијама, ако су различити условни скокови у корелацији, и да бафер историје не може да садржи битове из исте бранше, ако постоје многи друге гране између. Оно може да користи прилагодљиви предвиђач са два-нивоа.
Ова шема је једино боља од шеме бројача засићења за велике табеле, а ретко је добра као локално предвиђање. Бафер историје мора бити дужи како би направио добро предвиђање. Величина табле историје шаблона расте експоненцијално са величином бафера историје. Дакле, велики шаблон табеле историје мора да се дели између свих условних скокова.
Прилагодљиви предвиђач са два-нивоа дс глобално заједничким историјским бафером и образац табеле историје се зове "gshare" продвиђач, ако његов xors глобалне табеле историје и гране PC-а, и "gselect" ако их спаја. Глобално предвиђања се користи у AMD микропроцесориме и Intel Pentium M, Core и Core 2.
Измешано предвиђање гранања
[уреди | уреди извор]Измешано предвиђање гранања[7] комбинује локалне и глобалне принципе предвиђања помоћу спајања локалне и глобалне историје гранања, вероватно са неким битовима из бројача програма. Тестови показују да VIA Nano процесор може да се користи ову технику.[2]
Предиктор усаглашавања
[уреди | уреди извор]Предиктор усаглашавања је прилагодљиви предвиђач са два-нивоа са глобалном дељеном историјом бафера и табелом шаблона историје, и додатни локални бројаћ засићења. Излази локалног и глобалног предвиђања су XOR-овани једни са другима да дају коначно предвиђање. Циљ је да се смање аргументи у табели шаблона историје где се деси да две гране са супротним предвиђањем деле исти унос у табели шаблона историје.[8]
Предиктор усаглашавања се користио у првој верзији Интел Пентијум 4, али је касније напуштен.
Хибридни предвиђач
[уреди | уреди извор]Хибридни предвиђач, такође се назива комбиновани предвиђач, имплементира више од једног механизма предвиђања. Коначно предвиђање се заснива или на мета-предиктору да памти који од предиктора је направио најбоље предвиђање у прошлости, или на већини укупних функција које су базиране на непарним бројевима различитих предвиђача.
Scott McFarling је предложио комбиновање предвиђање гранања и свом раду 1993. године.[9]
На SPEC'89 ознакама, такав предиктор је добар као и локални предиктор.
Предвиђачи попут gshare користе више ставки табеле за праћење понашања једне посебне гране. Ово умножавање уноса чини да је много већа вероватноћа ће две гране бити мапиране на исти унос табеле (ситуација се зове преклапање), што заузврат чини да је много вероватно да ће тачност предвиђања трпети због тих грана. Када имате више предиктора, то је корисно да се организује да сваки предиктор има различито преклапање шаблона, тако да је више вероватно да бар један предиктор неће имати преклапање. Комбиновани предвиђачи са различитим индексирањем функција за различите предвиђаче се зове gskew предвиђач, и аналоган је искривљеном асоцијативном кешу који се користи за податке и кеширање инструкција.
Предвиђач петље
[уреди | уреди извор]Условни скок који контролише петљу се најбоље предвиђа са специјалним предвиђачем петље. Условни скок на крају петље који се понавља N пута ће се извршити N-1 пута и једном неће. Ако се условни скок налази на почетку петље, он се неће извршити N-1 пута и онда ће се извршити једном. Условни скок који иде много пута на један начин, а затим на другачији једном, испоставља се да има понашање петље. Такав условни скок се може лако предвидети са једноставним бројачем. Предиђач петље је део хибридног предвиђача где циљ-предвиђача детектује да ли условни скок има понашање петље.
Данас многи микропроцесори имају предвиђач петље.[2]
Предвиђање индиректиних скокова
[уреди | уреди извор]Инстукција индиректног скока може да бира између више од две гране. Новији процесори из Интела и AMD-а могу да предвиде индиректно гранање користећи прилагодљиви предвиђач са два-нивоа. Ова врста инструкције доприноси више од једног бита на историју бафера.
Процесори без овог механизма могу једноставно да предвиде индиректни скок да иде ка истом циљу као што је ишао и прошли пут.[2]
Предвиђање повратка функције
[уреди | уреди извор]Функција ће се нормално вратити тамо одакле је позвана. Инструкција повратка је индиректни скок који чита своју циљну адресу из позива стека. Многи микропроцесори имају одвојен механизам предвиђања за повратне инструкције. Овај механизам се заснива на такозваном енгл. return stack buffer, што је локално огледало позива стека. Величина бафера повратног стека је типично 4 - 16 уноса.[2]
Заобилажење предвиђања гранања
[уреди | уреди извор]Компромис између брзог предвиђања гранања и доброг предвиђања гранања се понекад успостави тако што ће имати два предвиђања гранања. Прво предвиђање гранања је брже и једноставније. Друго предвиђање гранања, које је спорије, компликованије, и са већим је табелама, ће вероватно заменити погрешно предвиђање од стране првог предвиђача.
Alpha 21264 и Alpha EV8 микропроцесори користе брзи једно-циклусни предвиђач следеће линије да би управљали понављањем циљног гранања и да би пружили једноставно и брзо предвиђање гранања. Зато што је следећи ред предвиђања нетачан, понављање решења гранања траје јако дуго, оба језгра имају два-сиклуса секундарног предвиђања гранања које може да заобиђе предвиђање следећег реда по цену да се изгуби један донет циклус.
Intel Core i7 има два циљна бафера гранања и евентуално два или више предвиђања гранања.[10]
Неуронски предвиђач гранања
[уреди | уреди извор]Машинско учење за предвиђање гранања користи LVQ и MLP, које се назива "неуронско предвиђање гранања", предложено је од стане Проф. Lucian Vintan.[11]
Истраживањима неуронског предвиђача гранања је много допринео проф Daniel Jimenez (УСА). Године 2001., (HPCA конференција) представљен је први енгл. perceptron предвиђач којег је било могуће имплементирати у хардверу.
Главна предност неуронског предвиђача је његова способност да искористи дугу историју док захтева само линеарну раст ресурса. Класични предвиђачи захтевају експоненцијални раст ресурса. Jimenez извештава о свеукупном побољшању од 5,7% над McFarling-овим стилом хибридног предвиђача.
Главни недостатак овог perceptron предвиђача је његово високо кашњење. Чак и након искоришћења предности велике брзине аритметичких трикова, рачунање кашњења је релативно захтевно у односу на период такта многих савремених микроархихектура. Да би се смањило предвиђање кашњења, 2003. године Jimenez је предложио брзи-пут неуронског предвиђача, где perceptron предвиђач бира своју тежину према тенутном путу гранања, а не према PC гранању. Многи други истраживачи су развили овај концепт (A. Seznec, M. Monchiero, D. Tarjan & K. Skadron, V. Desmet, Akkary et al., K. Aasaraai, Michael Black, итд.)
Већина најсавременијих предвиђача гранања користити perceptron предвиђач (види Интелово "Првенство такмичења у предвиђању гранања"[12]). Интел већ имплементира ову идеју у једном од симулатора IA-64 (2003).
Историја
[уреди | уреди извор]IBM Stretch, дизајниран у касним 50-им, унапред изврши сва безусловна гранања и било које условно гранање које зависи од индексираних регистара. За друго условно гранање, прва два модела имплементирају нетакнуто предвиђање; каснији модели су промењени тако да имплементирају предвиђања заснована на тренутној вредности индикатора битова (одговара данашњем стању кодова).[13] Дизајнери Stretch-а су разматрали статички погодак битова у инструкцијама гранања, у почетку рада на пројекту, али су се одлучили против тога. Опоравак од грешке предвиђања је обезбеђен од стране енгл. lookahead јединице на Stretch-u. Накнадни дизајн IBM-ових великиџ рачунара не користи предвиђањ гранања са спекулативним извршењем све до појаве IBM 3090, 1985. године.
Двобитне предвиђаче су увели Tom McWilliams и Curt Widdoes, 1977. године, за Lawrence Livermore National Lab S-1 суперрачунар и независно од стане Jim Smith-а, 1979. године на CDC.[14]
Микропрограмирани процесори, популарни од 1960-их до 1980-их и даље, узимају више циклуса по инструкцији, а генерално не захтевају предвиђање гранања. Међутим, заједно са IBM-3090, постоји неколико примера микропрограмираних дизајна који имају уграђено предвиђање гранања.
Burroughs B4900, микропрограмирана COBOL машина избачена 1982. год. била је са проточном обрадом и користила је предвиђање гранања. B4900 историја предвиђања гранања је ускладиштена назад у унутрашњој меморији инструкција током извршавања програма. B4900 реализује 4-фазно предвиђање гранања помоћу 4 семантички еквивалентних грана opcode-а да представљају сваку врсту гране оператора. Оpcode користи указану историју те инструкције гранања. Ако хардвер утврди да фаза предвиђања гранања одређене гране треба да се ажурира, он ће прерадити операциони код са семантички еквивалентним операционим кодом који је погодио одговарајућу историју. Ова шема је добила 93% стопу поготка. US патент 4.435.756 и други, одобрени су на овој шеми.
VAX 9000, најављен 1989. године, био је и микропрограмиран и са проточном обрадом, и обављао је предвиђање гранања[15]
Први комерцијални RISC процесори, MIPSR2000 и R3000 и ранији SPARC процесори, извршавали су само једноставно "не-узето" предвиђање гранања. Зато што користе кашњење слота гранања, преузимају само једну инструкцију по циклусу, а извршавају у-реду, није било губитка перформанси. Касније, R4000 користи исто тривијално "не-узет" предвиђање гранања, и губи два циклуса за сваку узету грану, јер понављање резолуција грана је било дуго четири циклуса.
Предвиђање гранања је постало важније са инструкцијом проточне обраде, суперскаларног процесора као што је Интел Пентијум, DEC Alpha 21064, MIPS R8000, и IBM POWER серије. Сви ови процесори се ослањају на један бит или на једноставни бимодални предвиђач.
DEC Alpha 21264 (EV6) користи предвиђач следеће линије који је замењен комбинацијом локалног и глобалног предвођача, где је избор комбинације направљен помоћу бимодалног предвиђача[16]
AMD K8 комбинује бимодални и глобални предвиђач, где је избор комбинације други бимодални предвиђач. Овај процесор кешира базу и избор бројача бимодалног предвиђача у битове L2 кеша који се иначе користе за ECC. Као резултат тога, она има веома велику базу и избор предвиђања табеле, и парност уместо ECC-а на инструкцији у L2 кеш меморији. Парност је сасвим у реду, јер свака грешка инструкције парности може се поништити и вратити из меморије.
Alpha 21464[16] (EV8, касније отказано у дизајну) има казну од 14 циклуса за промашај предвиђања гранања. Користила је сложен али брз предвиђач нареднне линије замењен комбинацијом бимодалног и majority-voting предвиђача. Мајоrity vote је био између бимодалног предвиђача и два gskew предвиђача.
Види још
[уреди | уреди извор]Референце
[уреди | уреди извор]- ^ P. Shen, John; Lipasti, Mikko (2005). Modern processor design: fundamentals of superscalar processors. Boston: McGraw-Hill Higher Education. стр. 455. ISBN 978-0-07-057064-1.
- ^ а б в г д ђ е Fog, Agner (2009). „The microarchitecture of Intel, AMD and VIA CPUs”. Приступљено 1. 10. 2009.
- ^ The Pentium 4 and the G4e: an Architectural Comparison, Ars Technica
- ^ S. McFarling Combining Branch Predictors Digital Western Research Lab (WRL) Technical Report, TN-36, 1993
- ^ Yeh, T.-Y.; Patt, Y. N. (1991). „Two-Level Adaptive Training Branch Prediction”. Proceedings of the 24th annual international symposium on Microarchitecture. Albuquerque, New Mexico, Puerto Rico: ACM. стр. 51—61.
- ^ S. McFarling Combining Branch Predictors Digital Western Research Lab (WRL) Technical Report, TN-36, 1993:8
- ^ Skadron, K.; Martonosi, M; Clark, D.W. (2000). „A Taxonomy of Branch Mispredictions, and Alloyed Prediction as a Robust Solution to Wrong-History Mispredictions”. Proceedings of the 2000 International Conference on Parallel Architectures and Compilation Techniques. Philadelphia.
- ^ Sprangle, E. (1997). „The Agree Predictor: A Mechanism for Reducing Negative Branch History Interference”. Proceedings of the 24th International Symposium on Computer Architecture. Denver.
- ^ McFarling (1993). "Combining Branch Predictors Архивирано на сајту Wayback Machine (21. новембар 2008)" – introduces combined predictors.
- ^ WO 2000/014628, Yeh, Tse-Yu & Sharangpani, H P, "A method and apparatus for branch prediction using a second level branch prediction table", published 16. 3. 2000
- ^ Vintan, Lucian N. (1999). Towards a High Performance Neural Branch Predictor (PDF). Proc. Int'l J. Conf. on Neural Networks (IJCNN). Архивирано из оригинала (PDF) 13. 07. 2019. г. Приступљено 03. 01. 2014.
- ^ „Championship Branch Prediction”. Архивирано из оригинала 28. 05. 2008. г. Приступљено 03. 01. 2014.
- ^ IBM Stretch (7030) -- Aggressive Uniprocessor Parallelism
- ^ S-1 Supercomputer
- ^ Micro-architecture of the VAX 9000
- ^ а б Seznec, Felix, Krishnan, Sazeides. Design Tradeoffs for the Alpha EV8 Conditional Branch Predictor
Литература
[уреди | уреди извор]- P. Shen, John; Lipasti, Mikko (2005). Modern processor design: fundamentals of superscalar processors. Boston: McGraw-Hill Higher Education. стр. 455. ISBN 978-0-07-057064-1.
Спољашње везе
[уреди | уреди извор]- Seznec et al. (1996). "Multiple-Block Ahead Branch Predictors" – demonstrates prediction accuracy is not impaired by indexing with previous branch address.
- Seznec et al. (2002). "Design Tradeoffs for the Alpha EV8 Conditional Branch Predictor" – describes the Alpha EV8 branch predictor. This paper does an excellent job discussing how they arrived at their design from various hardware constraints and simulation studies.
- Jimenez (2003). "Reconsidering Complex Branch Predictors" – describes the EV6 and K8 branch predictors, and pipelining considerations.
- Fog, Agner (2009). „The microarchitecture of Intel, AMD and VIA CPUs”. Приступљено 1. 10. 2009.
- Andrews, Jeff (30. 10. 2007). „Branch and Loop Reorganization to Prevent Mispredicts”. Intel Software Network. Архивирано из оригинала 17. 04. 2008. г. Приступљено 20. 8. 2008.
- Yee, Alexander. „What is Branch Prediction? - Stack Overflow Example”.