Şube öngörüsü, koşulları hala kontrol etmeniz gerekiyorsa nasıl çalışır?


30

Şube Tahmini hakkındaki popüler cevabı https://stackoverflow.com/q/11227809/555690 adresinden okuyordum ve kafamı karıştıran bir şey var:

  • Doğru tahmin ederseniz, devam ediyor.
  • Yanlış olduğunu tahmin edersen, kaptan duracak, geri duracak ve anahtarı çevirmen için sana bağıracak. Sonra diğer yoldan yeniden başlatılabilir.

Her seferinde doğru tahmin ederseniz , tren asla durmak zorunda kalmayacak.

Çok sık yanlış olduğunu tahmin ederseniz , tren durma, yedekleme ve yeniden başlatma için çok zaman harcar.

Ama bu anlamadığım şey: tahmininin doğru mu yanlış mı olduğunu bilmek , yine de bir durum kontrolü yapmak zorundasın . Öyleyse, her iki durumda da aynı şartlı kontrolü yapıyorsanız, şube tahmini nasıl çalışır?

Söylemeye çalıştığım şey, yine de aynı koşullu kontrolleri yaptığınız için şube tahmini ile aynı şekilde şube tahmini olmadığı kadar aynı değil mi? (Açıkçası yanılıyorum ama anlamadım)


1
Bu wiki makalesi bunu açıklamakta oldukça iyi bir iş çıkarıyor.
enderland

8
Modern bir CPU pipeline edildi ve aynı anda birkaç şey yapabilir. Böylece hala doğru tahmin edilip edilmediğini anlamaya çalışırken tahminini uygulamaya başlayabilir. Tahmin doğru ise, boru hattı çalışmaya devam eder. Yanlış bir tahmin üzerine, boru hattı atılır ve "doğru cevap" noktasından yürütme yeniden başlar.
markspace

2
İlgili okuma: boru hattı . Ben de bu soruya verilen cevapları tekrar okumanızı tavsiye ederim.

Yanıtlar:


19

Elbette durum her seferinde kontrol edilir. Ancak kontrol edildiğinde CPU boru hattına çok uzak. Bu arada, diğer talimatlar boru hattına da girmiştir ve çeşitli uygulama aşamalarındadır.

Genellikle, bir koşulu derhal ardından koşul TRUE olarak değerlendirilirse dallanan veya koşul FALSE olarak değerlendirilirse düştüğü koşullu bir dallanma talimatı izlenir. Bu, koşulun DOĞRU veya YANLIŞ olarak değerlendirilip değerlendirilmediğine bağlı olarak, koşul talimatı ve dal talimatından sonra boru hattına yüklenebilecek iki farklı talimat akışı olduğu anlamına gelir. Ne yazık ki, koşul talimatını ve dal talimatını yükledikten hemen sonra CPU, koşulun ne için değerlendirileceğini henüz bilmiyor, ancak yine de boru hattına malzeme yüklemeye devam etmesi gerekiyor. Bu nedenle, koşulun neye göre değerlendirileceğine dair bir tahmine dayanarak iki talimat setinden birini seçer.

Daha sonra, durum talimatı boru hattında ilerlerken, değerlendirilme zamanı gelmiştir. O zaman, CPU tahmininin doğru mu yanlış mı olduğunu anlar.

Tahmin doğru çıktığında, şube doğru yere gitti ve doğru talimatlar boru hattına yüklendi. Tahminin yanlış olduğu ortaya çıkarsa, koşullu branş talimatından sonra boru hattına yüklenen tüm talimatlar yanlıştı, atılmaları gerekir ve talimatların alınması doğru yerden tekrar başlamalıdır.

düzeltme

StarWeaver'ın yorumuna cevaben, tek bir komut uygulamak için CPU'nun ne yapması gerektiğine dair bir fikir vermek için:

MOV AX,[SI+10]İnsanların naif bir şekilde "SI plus 10 kelimesiyle AX yükleyin" olarak düşündüğümüz kadar basit bir şey düşünün . Kabaca, CPU'nun yapması gerekenler:

  1. PC içeriğini ("program sayaç yazıcısı") adres veriyoluna gönderir;
  2. opbus veri kodundan talimat kodunu oku;
  3. artım PC;
  4. onunla ne yapılacağını anlamak için opcode kodunu çözmek
  5. PC içeriğini adres veriyoluna yayar;
  6. komut işlecini (bu durumda 10) veri yolundan okuyun;
  7. artım PC;
  8. operand ve SI değerini toplayıcıya besleyin;
  9. toplayıcı sonucunu adres veriyoluna gönderir;
  10. veri yolundan AX'ı okuyun.

Bu bir kuyruklu 10 adımdır. Bu adımlardan bazıları boru hattı olmayan CPU'larda bile optimize edilebilecektir, örneğin CPU hemen hemen her zaman bir sonraki adıma paralel olarak PC'yi artıracaktır; bu, PC'nin çok özel bir kayıt olduğu için yapılması kolay bir şeydir. hiçbir zaman başka bir iş için kullanılmadığı için, bu özel kayıt defterine erişim için CPU'nun farklı bölümleri arasında çekişme olasılığı yoktur. Ancak yine de, bu kadar basit bir talimat için 8 adım kaldı, ve CPU adına zaten bir dereceye kadar karmaşıklığa sahip olduğumu farz ediyorum, mesela, örneğin, CPU için ilave bir adım atmaya gerek olmayacağını tahmin ediyorum. Toplayıcı, sonuçtan okunmadan önce eklemeyi gerçekten gerçekleştirecek,

Şimdi, sonuçlarını hesaplamak için aslında CPU içinde döngüler yapan daha karmaşık adresleme modları, MOV AX, [DX+SI*4+10]hatta hatta çok daha karmaşık talimatlar olduğunu düşünün MUL AX, operand.

Yani, buradaki amacım, "atomik seviye" metaforunun CPU komut seviyesi için uygun olmaktan uzak olduğu. Gerçek mantık geçidi seviyesine çok fazla inmek istemiyorsanız, boru hattı adım seviyesi için uygun olabilir.


2
Huh, problemin bir kısmının (ben de dahil olmak üzere) bunu anlama konusunda sahip olup olmadıklarını merak ediyorum (sadece benim için) bir cpu hayal etmenin sadece tek bir talimat hakkında kısmi bilgiye sahip olduğunu düşünmenin zor olduğunu; ya da yarı yarıya bir araya getirilmiş talimatların "pizza bantlı fırının içinden geçmesi"… en azından benim için, erector set ve metal torna seviyesi arasındaki şeylerle çalışmaya alışkın olduğumda, atomik bir ölçekte değişme hissi veriyor.
StarWeaver

1
@ StarWeaver Yorumunuzu beğendim, bu nedenle yanıtımı değiştirdim.
Mike Nakis

1
Vay, güzel açıklama. Sadece ne kadar hareketli kelimelere daha yararlı yerlere gittiğini unutacağım. Yine de bir cpuyu kayışla çalışan pizza fırınları kümesi olarak görüyorum: 3.
StarWeaver

Bu akılda değer taşıyan bulunuyor yığın taşması soru muhtemelen "dallanma tahmini" bile var olduğunu önceden bilmediğiniz gerçeği 1 milyonun üzerinde programcıları tanıtıldı 1,3 milyon manzarası one - - bir örnek sergileyen OP tarafından bağlanmış Java'da . Java gibi dillerin bize sağladığı soyutlama düzeyinde çalışmaya alışkın olan benim gibi insanlara MOV AX,[SI+10], yabancı, hatta "basit" değil; Günümüzde çoğu programcı hiç derleme yazmadı. "Saf bir şekilde" bir şey ifade etmediğini düşünüyoruz.
Mark Amery

@MarkAmery iyi, tamam, "biz insanlar" derken "biz derleme yazmaya cesaret eden insanlar" demek istediğimizi açıkça belli ettim. Yapılması gereken nokta, assembly dili programcılarının bile her zaman hatta hatta hiç bir şekilde boru hattını düşünmediğidir.
Mike Nakis

28

GPS'siz bir yolculuk gibi düşünün. Bir kesişme noktasına geliyorsunuz ve dönmeniz gerektiğini düşünüyorsunuz, ancak tamamen emin değilsiniz. Yani sırayı sen al, ama yolcundan haritayı kontrol etmesini iste. Belki de nerede olduğunu tartışmayı bitirdiğinde yolun 3 mil aşağısındasın. Haklıysan, dönmeden önce durup tartışsan, olacağından üç mil uzaktasın. Eğer hatalıysan, geri dönmelisin.

CPU boru hatları aynı şekilde çalışır. Durumu kontrol edebildikleri zaman, zaten yolun aşağısındaki yollardır. Aradaki fark, üç mil geri gitmeleri gerekmiyor, sadece başlangıçlarını kaybediyorlar. Bu denemede zarar yok demektir.


2
Bu açıklama temiz.
sharptooth

2

Anladığım kadarıyla, şube tahmini, kontrol etmeniz gereken koşulun pahalı veya halen devam eden bir şeyin sonucunu gerektirdiği durumlarda en faydalı olanıdır, aksi halde durumu değerlendirmek için değer bekleyen bir parmağınızı titrersiniz.

Sıra dışı çalıştırma gibi şeylerle, işlemcide CPU'nun kullanamayacağı boş satırları doldurmaya başlamak için dal tahminini kullanabilirsiniz. Olmadığı bir durumda, bir nedenden ötürü, boru hattındaki herhangi bir boşta devir, o zaman evet, şube tahmininde bir kazanç yoktur.

Ama burada önemli çünkü işlemci tahmin dallarından biri için çalışmalarını başlıyor, olduğu edemez henüz durumun kendisi değerlendirir.


1

Kısa form:

Bazı CPU'lar eskisini bitirmeden önce yeni bir talimat üzerinde çalışmaya başlayabilir. Bunlar dal tahmini kullanan CPU'lardır.

Bir sözde kod örneği:

int globalVariable;
int Read(int* readThis, int* readThat)
{
    if ((globalVariable*globalVariable % 17) < 5)
       return *readThis;
    else
       return *readThat;
}

Yukarıdaki kod kontrolleri bir durumdur ve bu bellek konumunda depolanan değeri ya dönmek gerekir sonucuna dayalı olarak addThisya da depolanmış değer readThat. Şube öngörüsü koşulu tahmin ederse true, CPU ifadeyi addThisdeğerlendirmek için gereken hesaplamayı yaparken hafıza konumunda depolanan değeri zaten okuyacaktır if. Bu basitleştirilmiş bir örnek.


1

Evet, durum her iki şekilde de kontrol edilir. Ancak şube tahmininin avantajı, durum kontrolünün sonucunu beklemek yerine iş yapabilmenizdir.

Diyelim ki bir makale yazmak zorundasınız ve konu A veya konu B ile ilgili olabilir. Öğretmeninizin A konusunu B'den daha çok sevdiğini ve daha sık seçtiğini önceki denemelerden biliyorsunuz. Kararını beklemek yerine, ilk konuyla ilgili makaleyi yazmaya başlayabilirsiniz. Şimdi iki olası sonuç var:

  1. Makaleye yanlış konuyla başladın ve şu ana kadar yazdıklarını bırakmak zorundasın. Diğer konu hakkında yazmaya başlamanız gerekir ve beklemiş olduğunuz gibi aynı zaman çabasıdır.
  2. Doğru tahmin ettin ve zaten işin var.

Modern CPU'lar çoğu zaman boştalar çünkü GÇ yanıtlarını veya diğer hesaplamaların sonucunu bekliyorlar. Bu süre gelecekteki bazı işleri yapmak için kullanılabilir.

Bu boş zaman zarfında ne yaptığınızı reddetmek zorunda olsanız bile - programın hangi yolu seçeceğini tahmin etme yeteneğine sahipseniz daha etkili olabilir. Ve modern işlemciler bu yeteneğe sahiptir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.