Dallanma öngörüsü

Dallanma Öngörüsü, bilgisayar mimarisinde çalıştırılacak programın buyruk kümesi içindeki dallanma buyruklarına gelindiğinde koşula göre atlanacağını ya da atlanmayacağını önceden varsayarak veya geçmişine bakıp tahmin ederek öngörüde bulunma işidir. Bugünkü işlemcilerin tasarımında boru hattı yöntemi kullanıldığı ve başarım hedeflerinin yüksek olduğu düşünüldüğünde bir dallanmada hangi yöne gidileceğini yüksek doğrulukta tahmin etmek kaçınılmaz olmuştur. Bu öngörü işlemciye dallanmanın sonucunu beklemeden diğer buyrukları işleme imkânı verir. Bu da zamandan kazanç anlamına gelir ki başarımı yükseltir. Bu arada da işlemcinin şimdiki buyruğun işlenmesi bitmeden sonraki buyruğun adresini bilmesi gerekir.

Dallanmayı öngörme boru hatttındaki denetim sorununu çözme ihtiyacından doğmuştur. Dallanmanın olduğu yerde sonucun ne olduğunu bilmeden hareket etmeye çalışmak denetim sorunu oluşturur. Bu sorunu sonuç belli olana kadar durup bekleyerek çözmek yerine, öngörüde bulunarak (tahmin doğru ise devam edip, yanlış ise baştan tekrar deneyip ) çözmek daha doğru bir karar olacaktır.

Dallanmayı öngörme, program sayacının alt bitleriyle (en düşük basamak)
erişilen bir sayaç tablosu kullanılarak yapılır. Bu sayaç tablosuna öngörücü denir. Yüksek doğrulukta öngörü için iki bit gerekir; tek bit yeterli olmayabilir çünkü tek bitle sadece bir önceki durum hatırlanabilir.Tek bit ile bir dallanmanın hem başını hem de sonunu yanlış tahmin etme olasılığımız hep vardır. İki bitle ise yanlış tahmin dallanmanın sonunda olmak üzere bir sefere inmiştir.

Dallanmada öngörü yapılsa bile unutulmaması gereken bir durum vardır: Dallanma buyruğunun sonucu anlaşıldığında çoktan diğer buyruklar boru hattına girmiştir. Tahminin yanlış olması durumunda yanlış yerden yakalanan buyruklar boru hattından geri dönemeyeceğine göre buyrukların boru hattından çıkması beklenir.

Örnek
Aşağıdaki kodun 5 aşamalı (Getir -G-, Çöz -Ç-, Yürüt -Ü-, Bellek -B-, Yaz -Y-) boru
hattındaki görünümü üzerinden açıklayalım. Dallanma buyruklarının koşulları yürütme aşamasında çözüldüğü varsayılsın ve sonuçlar yazmaçlara yazıldıkları vuruşta okunabilsin, yürütme sonraki vuruşta başlasın. Dallanma öngörüsü olarak 'atlamadığı' varsayılan bir tasarımda aslında atlaması gereken bir durum karşımıza çıkmış olsun.

ADD R3,R3,4;
LW R9,(R3);
BLE R8,R9,B3;
MOVE R3,R7;
ADD R3,R3,4;
B3:
ADD R6,R6,1;
ADD R7,R7,1;

buyruk
ADD R3, R3,4; GÇÜBY
LW R9, (R3);GÇÇÇÜBY
BLE R8, R9, B3;GGGÇÇÇÜBY
MOVE R3, R7;GGGÇÜBY
ADD R3, R3,4;GÇÜBY
ADD R6, R6,1;GÇÜBY
ADD R7, R7,1;GÇÜBY

Burada dallanma buyruğu olan 'BLE R8, R9, B3' ün atlayacağı yürütme vuruşunda çözüldüğü anda ardındaki ve öngörü gereği 'MOVE R3, R7 ve ADD R3, R3,4' buyrukları boru hattına girmiş bulunmaktadır. Burada yapacak bir şey yoktur, bu buyrukların boru hattından çıkması beklenecek, daha sonra 'B3' kısmına atlanacaktır.

Dallanma Öngörme Yöntemleri
Dallanma Öngörüsü genel anlamda iki türlü yapılabilir:

Durağan:
Tasarımda en baştan dallanma davranışına karar verilir. Dallanmanın her durumda atlayacağını varsaymak bu türden bir öngörüdür (Tersi, yani her zaman atlamayacağını varsaymak da aynı şekilde). Kuşkusuz hata olacaktır; hata olduğu takdirde boru hattını temizleyip diğer durumun buyruklarını boru hattına almak gerekir. Durağan öngörüler döngülerin bolca kullanıldığı programlarda iyi çalışabilir.

Devingen:
Dallanmanın geçmişine bakılarak fikir sahibi olunur, programın gelecekte nasıl bir yön izleyeceğine bu şekilde sonradan karar verilir. Burada bir tahmin söz konusudur, programın geçmiş davranışına ait desen, örnek vs. bir tabloda tutulur, program sayacıyla birlikte bu tablo da kullanılarak karar verilir.
Çift Doruklu:Dallanmaların çoğu zaman atlama ya da atlamama davranışı gibi iki kutuplu özelliği söz konusudur.
İki Aşamalı:Geçmişin tutulduğu bir tablo ve buna göre öngörünün yapıldığı ikinci tablo ile iki seviye söz konusudur.
Melez:Farklı öngörücülerin daha yüksek verim almak adına birleştirilerek dallanmaya göre seçimi söz konusudur.

Çift Doruklu Dallanma Öngörüsü
Tipik bir dallanmanın davranışı aslında rastgele değildir; ya çoğu zaman atlarlar ya da atlamazlar. Çift doruklu öngörü de işte, bir dallanmanın bu iki davranıştan hangisini gösterdiğinin ayrımından faydalanır. Öngörücüsü, program sayacının alt bitleriyle adreslenen bir sayaçlar tablosudur. Her sayaç iki bit uzunluktadır. Her atlandığında uygun olan sayaç bir arttırılır; aynı şekilde atlanmadığında uygun olanı bir eksiltilir. En anlamlı bit öngörüyü belirler. Sayacın sıfırdan (00) ve üçten (11) sonra doyuyor olması (yani 11 den sonra artmaz ve 00 dan sonra eksilmez), tekrarlı atlayan dallanmaların atlayacağı, atlamayanların ise atlamayacağı anlamına gelir. Bu 2-bit öngörücüyle art arda iki kez yanlış tahmin yapıldığında öngörü değişir. Küçük öngörücü tablolarda birkaç dallanma aynı sayacı paylaşabilmesine rağmen daha büyükleri için her bir dallanma tek bir sayaca gider. Tahmindeki doğruluk daha az sayıda paylaşılan sayaç olması koşuluyla öngörücü tablosu boyuyla doğru orantılı olarak artar ve SPEC'89 denektaşları ile %93 civarında doygunluğa ulaşır.

Öngörü gerçekleştirimi için farklı bir yol ise kümeli ilişkilendirme metoduyla her sayaca bir de etiket ekleyerek sayaç-dallanma eşleştirmesinde karşılaştırma yoluna gidilmesidir. Bu yol sabit sayıdaki sayaçlar için daha verimlidir. Öngörüde yapılan yanlışlıkların sebebi ise o dallanma için yanlış tahmin yapılması ya da farklı dallanma buyruğunun geçmişinin okunarak tablo adreslemesinde hata yapılmasıdır.

Yerel Geçmişe Bağlı 2 Aşamalı Dallanma Öngörüsü
Dallanmaların çoğunlukla yinelenen örüntü (desen) davranışı gösterdiğini göz önünde bulundurursak, çift doruklu öngörüden daha fazlasını yapabiliriz. Şöyle bir döngümüz olsun:
for (i=1; i