Şube Tahmini Nedir?

Hemen hemen her bilgisayar programında, kodun ayrı yollara ayrılan bölümleri vardır. Örneğin, if-then-else ifadesinin iki olası sonucu vardır. CPU her komutu sırayla işlediğinden, bu ifadeler sıralı işlemciler için herhangi bir sorun oluşturmaz. Dallar, aynı anda birden fazla talimat yürütüldüğünden, ardışık düzen işlemciler için büyük bir sorun teşkil eder.

Senaryo

İki olası sonucu olan bir dallanma ifadesi olan bir program söz konusu olduğunda, iki olası kod yolu aynı yerde olamaz. Her iki seçeneği de tamamlamak için gereken işlem farklı olacaktır. Aksi takdirde, program dallanmaz. Bir if ifadesi gibi, yalnızca bir kez alınan çok sayıda dallanma ifadesi olacaktır.

Bir döngü oluşturan dallanma ifadeleri de vardır. Bunlar tek kullanımlık ifadeler kadar sayısal olarak yaygın olmasa da, genellikle istatistiksel olarak tekrarlanırlar. Bir dalın sizi bir döngüye geri götürme ihtimalinin olmamasından daha muhtemel olduğu varsayılabilir.

Bu Neden Bir Sorun?

Bu sorunun tam sıralı bir işlemcide nasıl ifade edildiği önemli değildir. Bu sadece bir sorun değil. Aşağıdaki talimatın ilk kısmı işlenmeden önce hangi şubenin alınacağı bilinmektedir.

Ancak ardışık düzen işlemcide aşağıdaki yönergeler kuyruğa alınır. İşlemci hangi dalın alındığını bildiğinde zaten işleniyorlar. Peki işlemci bu senaryoyu nasıl ele almalı? Birkaç seçenek var. En kötüsü, hangi dalın alacağı cevabını beklerken boru hattını boşta bırakmaktır. Bu, bir dallanma ifadeniz olduğu her zaman, en az işlem hattındaki aşamalarınız kadar çok sayıda işlemci zamanını kaybedeceğiniz anlamına gelir.

Alternatif olarak, işlem hattında her iki seçeneği de çalıştırmayı deneyebilir ve yanlış seçimi atabilirsiniz. Bu, hiçbir şey yapmamanın cezasının yarısına sahip olur, ancak yine de her dallanma ifadesinde bir performans cezasına maruz kalır. Modern CPU'ların da talimatları bozuk çalıştırabileceği göz önüne alındığında, potansiyel olarak her dallanma talimatını mümkün olan en kısa sürede çalıştırmayı deneyebilirsiniz. Yani sonucu ihtiyaç duyulmadan önce bilinir. Bu seçenek, ölçeklenebilir olmaması dışında yardımcı olabilir. Göreceli olarak yüksek bir dallanma deyimine sahip olduğunuzu varsayalım. Bu durumda, boş zamanınız olmadan hepsini erkenden çalıştıramazsınız.

Bu Sorun Gerçekten Nasıl Ele Alınır?

Gerçekte, işlemci bir dal tahmincisi içerir. Dal tahmincisi, bir dallanma seçiminin hangi sonucunun alınacağını tahmin etmeye çalışır. İşlemci daha sonra tahminin doğru olduğunu varsayar ve talimatları programlar. Şube tahmincisi doğruysa, performans cezası yoktur.

Dal tahmincisi bir hata yaparsa, boru hattını temizlemeli ve gerçek sonucu işlemeye başlamalısınız. Bu, hiçbir şey yapmamak ve sonucu beklemekten biraz daha kötü bir performans cezasına neden olur. En iyi performansı elde etmek için dal tahmincisinin mümkün olduğunca doğru olmasını sağlamak önemlidir. Bu konuda bir dizi farklı yaklaşım var.

Eşleşen Kod

Makine kodunda, bir dal her zaman bir sonraki talimatı okumak veya başka bir yerde bir dizi talimata atlamak arasında bir seçimdir. Şube tahmincilerinin bazı erken uygulamaları, tüm dalların her zaman alınacağını veya asla alınmayacağını varsayıyordu. Derleyiciler bu davranışı biliyorsa ve en olası sonucun işlemcinin genel durumuyla aynı hizaya gelmesi için makine kodunu ayarlamak üzere tasarlanmıştır. Varsayım. Bu, çok fazla ayarlama ve yazılım geliştirme alışkanlıklarının ayarlanmasını gerektirir.

Diğer bir alternatif ise, istatistikten döngülerin genellikle alındığını ve dal geriye doğru giderse her zaman atladığını öğrenmekti. talimat akışı ve atlama ileri ise asla atlamayın çünkü bu normalde istatistiksel olarak daha az olası bir durum olacaktır. döngü. Bunlar, bir dalın sonucunun derleme zamanında tahmin edildiği statik dal tahmininin her ikisidir.

Dinamik Dal Tahmincileri

Modern dal tahmin edicileri dinamiktir ve daha iyi tahmin başarı oranları elde etmek için şu anda çalışan programın istatistiklerini kullanır. Doygunluk sayacı, mevcut tüm dal tahmin edicileri için bir temeldir. İlk tahmine statik veya rastgele karar verilir. Bir dal alındığında veya alınmadığında, bu sonuç hafızanın bir bölümünde saklanır. Aynı dal bir daha geldiğinde, dal tahmincisi öncekiyle aynı sonucu tahmin eder.

Bu, doğal olarak, döngüler için iyi tahmin oranlarıyla sonuçlanır. Bunun iki versiyonu var. İlk sürümler, dalın alınıp alınmadığını belirtmek için tek bir veri biti kullandı. Daha sonraki sürümler, zayıf veya güçlü bir şekilde alınan veya alınmayan bir seçimi belirtmek için iki bit kullanır. Bu kurulum, program ona geri dönerse, genellikle başarı oranlarını artırarak bir döngü almanın sonucunu tahmin edebilir.

İzleme Modelleri

Kalıpları izlemek için, bazı dal tahmin edicileri, hangi seçimlerin yapıldığına dair bir geçmişin kaydını tutar. Örneğin, bir döngünün sürekli olarak çağrıldığını, ancak döngüden çıkmadan önce yalnızca dört kez döndüğünü varsayalım. Bu durumda, iki seviyeli bir uyarlanabilir tahmin edici bu kalıbı tanımlayabilir ve tekrar olacağını tahmin edebilir. Bu, basit bir doymuş sayaç üzerinde başarı oranlarını daha da artırır. Modern dal tahmincileri, kalıpları tespit etmek ve tahmin etmek için bir sinir ağı kullanarak bunu daha da geliştirir.

2 bitlik doygun bir dal tahmincisi, daha önce alınmamış olsa bile, bir dalın alındığını tahmin edebilir. Bu, bir kez bırakıldıktan sonra bile bir döngünün yeniden alınacağını tahmin etmesini sağlar.

Bazı dal tahmin edicileri birden fazla algoritma kullanır ve ardından hangi tahminin kullanılacağına karar vermek için sonuçları karşılaştırır. Bazı sistemler, yerel dal tahmini olarak adlandırılan yöntemle her dallanma talimatını ayrı ayrı takip eder. Diğerleri, tüm son dallanma talimatlarını izlemek için küresel bir dal tahmin sistemi kullanır. Her ikisinin de kullanımları ve dezavantajları vardır.

Bir kalıp geçmişi tablosu kullanan bir dal tahmincisi, belirli dallar alındığında tekrar eden kalıpları tanımlayabilir. Bir döngüden ayrılmadan önce yalnızca üç kez alındığını tahmin etmek gibi.

Çözüm

Dal tahmincisi, ardışık düzendeki bir CPU'nun özel bir parçasıdır. Asıl talimat işlenmeden önce bir dallanma talimatının sonucunu tahmin etmeye çalışır. Bu, ardışık düzen CPU'nun temel bir işlevidir, çünkü CPU'nun hangi talimatların yürütülmesi gerektiğinden emin olmasa bile boru hattını doygun tutmasına izin verir. Doğru olduklarında performansta herhangi bir azalma sağlamazlar. Modern algoritmalar, nispeten öngörülebilir iş yüklerinde zamanın %97'sine kadar doğru olabilir.

Mükemmel bir tahmin yöntemi yoktur, bu nedenle uygulamalar değişir. Yanlış bir tahmin yapmanın performansa etkisi, boru hattının uzunluğuna bağlıdır. Spesifik olarak, tahminin yanlış olup olmadığı belirlenmeden önce boru hattının uzunluğu belirlenebilir. Ayrıca, her bir boru hattı aşamasında kaç talimat olduğuna da bağlıdır. Modern üst düzey masaüstü CPU'lar yaklaşık 19 ardışık düzen aşamasına sahiptir ve her aşamada aynı anda en az dört talimat çalıştırabilir.