Şube tahmini optimizasyonu için hangi kod daha iyidir?


10

Şube tahmini ve ayrıca derleyici optimizasyonlarının etkisi göz önüne alındığında, hangi kod üstün performans sunar?

BRareExceptionPresent'in nadir bir koşulu temsil ettiğini unutmayın. Bu normal mantık yolu değildir.

/* MOST COMMON path must branch around IF clause */

bool SomeFunction(bool bRareExceptionPresent)
{
  // abort before function
  if(bRareExceptionPresent)
  {
     return false;
  }    
  .. function primary body ..    
  return true;
}

/* MOST COMMON path does NOT branch */

bool SomeFunction(bool bRareExceptionPresent)
{
  if(!bRareExceptionPresent)
  {
    .. function primary body ..
  }
  else
  {
    return false;
  }
  return true;
}

9
Burada bir uzuv çıkacağım ve hiçbir fark olmadığını söyleyeceğim.
Robert Harvey

7
Bu muhtemelen farklı boru hattı mimarilerine sahip olduklarından (gecikme yuvaları vs gecikme yuvası yok) derlediğiniz belirli CPU'ya bağlıdır. Bunu düşünmek için harcadığınız zaman büyük olasılıkla çalıştırma sırasında kaydedilen zamandan çok daha fazladır - önce profil, sonra optimize edin.

2
Neredeyse kesinlikle erken mikro-optimizasyon.
Robert Harvey

2
@MichaelT Evet, profilleme, hedefte, platformda, içeriğindeki kod için performansla gerçekte neler olup bittiğini bilmenin tek güvenilir yoludur. Ancak, birinin genel olarak tercih edilip edilmediğini merak ettim.
dyasta

1
@RobertHarvey: Her iki koşulun karşılandığı durumlar hariç , erken mikro-optimizasyon : (1) döngüye milyarlarca (milyonlarca değil) denir; ve (2) ilmek gövdesi makine kodu açısından küçük olduğunda ironik olarak. Koşul # 2, genel gider için harcanan zamanın, faydalı iş için harcanan zamana kıyasla önemsiz olmadığı anlamına gelir . İyi haber şu ki, genellikle, her iki koşulun da karşılandığı durumlarda, doğası gereği dalsız olan SIMD (vektörleştirme) tüm performans sorunlarını çözecektir.
rwong

Yanıtlar:


10

Bugünün dünyasında, hiç önemi yok.

Dinamik şube tahmini (on yıllardır düşünülen bir şey (bkz . 1996'da yayınlanan Dinamik Şube Tahmin Şeması Sistem İş Yüklerinin Analizi ) oldukça yaygın bir yerdir.

Bunun bir örneği ARM işlemcisinde bulunabilir. Kol Tahmin Merkezi Arm Bilgi Merkezi'nden

Şube tahmin doğruluğunu artırmak için statik ve dinamik tekniklerin bir kombinasyonu kullanılır.

O zaman soru "kol işlemcideki dinamik dal tahmini nedir?" Dinamik dal tahmininin sürekli okunması, 2 bitlik bir tahmin şeması kullandığını gösterir (kağıtta açıklanmıştır), dalın güçlü veya zayıf bir şekilde alınıp alınmadığı veya alınmadığı hakkında bilgi oluşturur.

Zamanla (ve zamanla bu bloktan birkaç geçiş anlamına gelir), kodun hangi yöne gideceği hakkında bilgi oluşturur.

İçin statik tahmini , bu şube testi yapılır kod kendisini ve hangi yöne bakar şekilde bakar - Bir önceki talimatına veya kodunda başka bir tanesi:

ARM1136JF-S işlemcide kullanılan şema, tüm ileri koşullu dalların alınmadığını ve tüm geri dalların alındığını tahmin eder. Tüm dalların yaklaşık% 65'inden önce, tamamen tahmin edilmek için yeterli dal olmayan döngüler vardır.

Sparky tarafından belirtildiği gibi, bu döngüden daha sık döngüler anlayışına dayanmaktadır. Döngü geriye doğru dallar (üstte yeniden başlatmak için döngünün sonunda bir dal vardır) - normalde bunu yapar.

Derleyiciyi ikinci olarak tahmin etmeye çalışmanın tehlikesi, bu kodun gerçekten nasıl derleneceğini (ve optimize edileceğini) bilmemenizdir. Ve çoğunlukla önemli değil. Dinamik tahmin ile, fonksiyonun iki katı, erken dönüş için koruma ifadesinin atlanmasını öngörür. İki boşaltılan boru hattının performansı kritik performansa sahipse, endişelenmeniz gereken başka şeyler de vardır.

Bir stili diğerinin üzerinde okumak için gereken zaman daha büyük önem taşır - kodun bir insanın okuyabilmesi için temiz olmasını sağlamak, çünkü derleyici kodu ne kadar dağınık veya idealize ederseniz edin, gayet iyi bir şekilde çalışacaktır.


7
Ünlü stackoverflow soru bu dallanma tahmini gösterdi yapar bugün bile, madde.
Florian Margaine

3
@FlorianMargaine önemli olsa da, gerçekten önemli olduğu bir duruma gelmek, neyi derlediğinizi ve nasıl çalıştığını anlamayı gerektiriyor gibi görünüyor (kol vs x86 vs mips ...). Başlangıçta bu mikro optimizasyonu yapmaya çalışan kod yazmak büyük olasılıkla yanlış tesislerden çalışıyor ve istenen etkiyi elde etmiyor.

Tabii ki, DK'den alıntı yapmayalım. Ancak bence bu soru, profil oluşturma aşamasını geçtiğinizde açıkça optimizasyon anlamındaydı. :-)
Florian Margaine

2
@MichaelT Güzel cevap, ve sonucuna çok katılıyorum. Bu tür ön profilleme / soyut optimizasyon kesinlikle karşı üretken olabilir. Bir tahminde bulunma oyunu haline gelir ve bu da akıldışı nedenlerle tasarım kararları verilmesine neden olur. Yine de kendimi meraklı buldum; o
dyasta


9

Anladığım kadarıyla, CPU ilk kez bir dalla karşılaştığında, (destekleniyorsa) ileri dalların alınmadığını ve geri dalların olduğunu tahmin edecektir. Bunun mantığı, ilmeklerin (tipik olarak geriye doğru dallanan) alındığı varsayılır.

Bazı işlemcilerde, montaj talimatında hangi yolun daha olası olduğu hakkında bir ipucu verebilirsiniz. Bunun detayları şu an benden kaçıyor.

Ayrıca, bazı C derleyicileri de statik dal tahminini destekler, böylece derleyiciye hangi dalın daha olası olduğunu söyleyebilirsiniz. Buna karşılık, oluşturulan kodu yeniden düzenleyebilir veya bu bilgilerden yararlanmak için değiştirilmiş talimatları kullanabilir (hatta sadece yok sayabilirsiniz).

__builtin_expect((long)!!(x), 1L)  /* GNU C to indicate that <x> will likely be TRUE */
__builtin_expect((long)!!(x), 0L)  /* GNU C to indicate that <x> will likely be FALSE */

Bu yardımcı olur umarım.


3
"Anladığım kadarıyla, CPU ilk kez bir dalla karşılaştığında, (destekleniyorsa) ileri dalların alınmadığını ve geri dalların olduğunu tahmin edecektir." Bu çok ilginç bir düşünce. Bunun gerçekten ortak mimarilerde uygulandığına dair kanıtınız var mı?
blubb

5
Atın ağzından doğruca: İleri bir dal varsayılan olarak alınmaz. Geriye doğru bir dal varsayılan olarak alınır . Ve aynı sayfadan: "önek 0x3E - dalın statik olarak alındığı gibi tahmin edilmesi".
MSalters

Eşdeğer bir platform agnostik pragması var mı __builtin_expect?
MarcusJ
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.