Въпросът ми е как те съжителстват и работят заедно в съвременната CPU архитектура?
Как съжителстват предикторът на разклоненията и целевият буфер на разклоненията?
Отговори (1)
Имаш го леко обърнат. При всяко извличане вие индексирате във вашия предсказател на разклонения, който ви казва дали инструкцията, която току-що сте получили, ще бъде декодирана в взето разклоняване. Ако не, извличате следващия пореден адрес. Но ако вашият предиктор на разклонения казва, че това ще бъде взето разклонение, вие не знаете коя инструкция да извлечете следващата, тъй като все още не сте декодирали тази инструкция. Така че, за да не губите цикли в чакане за разрешаване на клона, бихте използвали целеви буфер за клонове (или BTB). BTB съхранява предишни адреси, където клонът е пренасочил контролния поток. Използвайки този механизъм, вие се опитвате да предвидите къде контролният поток ще бъде пренасочен този път. Тази техника има 100% успеваемост за безусловни разклонения, извиквания на функции и връщания, когато е сдвоена със стек от адреси за връщане. При условни разклонения процентът на успех е малко по-нисък, но все още е наистина добър, като се има предвид високата времева локалност на целите на разклоненията. Като пример можете да разгледате обратно разклонение на цикъл, който винаги ще се разклонява на едно и също място.
Когато инструкцията за разклоняване действително бъде разрешена (обикновено в етапа на декодиране или изпълнение на конвейера, в зависимост от изпълнението), вие ще коригирате стойностите както в предиктора на разклонения, така и в BTB, за да имате по-актуална информация за бъдещи прогнози.
Ето картинно обяснение как се извършва търсенето и актуализацията на BTB:
http://www-ee.eng.hawaii.edu/~tep/EE461/Notes/ILP/buffer.html