0Pricing
C++ Academy · Ders

Dallanma Tahmini ve Sıcak Döngüler

CPU'nun dallanmaları tahmin etmesine yardımcı olun ve derleyicinin iyileştirebileceği döngüler yazın

Dallanma Tahmini ve Sıcak Döngüler, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.

Dallanma Tahmincisi

Modern CPU'lar, önceki yönerge tamamlanmadan bir sonraki yönergeyi tahmin eder. Tahmin yanlış olduğunda işlem hattı durur ve 10-20 çevrimlik maliyet oluşur.

Öngörülebilir Dallanmalar

Neredeyse her zaman tek yönde ilerleyen (veya belirgin bir örüntüyü izleyen) dallanmalar iyi tahmin edilir. Rastgele dallanmalar performans için yıkıcıdır.

Sıralanmış Veri Yardımcı Olur

Sıralanmış veriler üzerinde koşullu bir işlemle yineleme yapmak, sıralanmamış verilere kıyasla çoğu zaman daha hızlıdır; tahminci örüntüyü öğrenir.

// Often much faster on sorted data
std::sort(v.begin(), v.end());
int sum = 0;
for (int x : v) {
    if (x > 128) sum += x;
}

Dallanmayan Kod

Mümkün olduğunda dallanmaları aritmetik işlemlerle değiştirin. CPU her iki yolu da değerlendirir ve dallanma olmadan birini seçer.

// Branchy
int max(int a, int b) { return (a > b) ? a : b; }

// Branchless (often equivalent in machine code)
int max(int a, int b) { return a + (b - a) * (b > a); }

Daha İyi Seçim Olarak std::max

Modern derleyiciler çoğu zaman dallanmayan kodu otomatik olarak üretir. Yalnızca anlaşılır kod yazın ve eniyileyicinin çalışmasına izin verin; ancak sıcak yollardaki assembly dökümünü inceleyin.

Olası ve Olası Olmayan İpuçları

C++20, derleyiciye ipucu vermek için [[likely]] ve [[unlikely]] ekledi.

if (error_condition) [[unlikely]] {
    handle_error();
}

Döngü Açma

Yineleme başına daha fazla iş yapmak dallanma sıklığını azaltır. Modern derleyiciler döngüleri kendileri açar; #pragma unroll seçeneğini yalnızca ölçümler yarar sağladığını gösterdiğinde kullanın.

Döngülerde Karma İş Yüklerinden Kaçının

Rastgele dönüşümlü iki duruma sahip bir döngü, tahmini bozar. Mümkün olduğunda iki durumu iki ayrı döngüye ayırın.

// Slow: random switching
for (auto& x : v) {
    if (x.type == A) process_A(x);
    else            process_B(x);
}

// Faster: partition first
std::partition(v.begin(), v.end(), [](auto& x) { return x.type == A; });
for (size_t i = 0; i < boundary; ++i) process_A(v[i]);
for (size_t i = boundary; i < v.size(); ++i) process_B(v[i]);

Sıcak İşlevleri Satır İçine Genişletin

Sıcak döngülerde işlev çağrısının ek yükü, işlev gövdesinin maliyetine yaklaşabilir. inline ipuçları yardımcı olur; __attribute__((always_inline)) (GCC/Clang) daha katıdır.

Sezginize Güvenmeyin

Derleyiciler ve CPU'lar çok zekidir. Eniyilemeden önce ölçün. Tahminci eğitildikten sonra "bariz" dallanmayan sürüm, dallanmalı sürümden daha yavaş olabilir.

Geniş Döngüler için SIMD

Otomatik vektörleştirme, mümkün olduğunda bir döngüyü SIMD yönergelerine dönüştürür. Temiz kod ve basit türler kullanın; yinelemeler arasındaki veri bağımlılıklarından kaçının.

Profil Yönlendirmeli Eniyileme (PGO)

Derleyin, çalıştırın, profil verilerini toplayın ve ipuçlarıyla yeniden derleyin. Derleyiciler, hangi dallanmaların sıcak olduğu konusunda daha iyi tahminler yapmak için bu verileri kullanır.

Hızlı Kontrol

Filtreleme döngüsünden önce verileri sıralamak, çalışmayı neden bazen hızlandırabilir?

Özet

Yanlış tahmin edilen dallanmalar çevrimlere mal olur. Dallanmaları öngörülebilir tutun (sıralanmış veriler yardımcı olur), olası/olası olmayan ipuçlarını kullanın, döngüleri tekdüze tutmak için iş yüklerini bölümlere ayırın ve profil oluşturma aksini kanıtlamadıkça eniyileme işini derleyiciye bırakın.

Sıkça Sorulan Sorular

“Dallanma Tahmini ve Sıcak Döngüler” dersi ücretsiz mi?

Evet — “Dallanma Tahmini ve Sıcak Döngüler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.

“Dallanma Tahmini ve Sıcak Döngüler” dersinde ne öğreneceğim?

CPU'nun dallanmaları tahmin etmesine yardımcı olun ve derleyicinin iyileştirebileceği döngüler yazın C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C++ Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Dallanma Tahmini ve Sıcak Döngüler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Önbellek Dostu Veri Düzenleri
  2. Dallanma Tahmini ve Sıcak Döngüler
  3. perf, vtune ve Sanitizer'larla Profil Oluşturma
  4. Google Benchmark ile Mikro Karşılaştırma
← C++ Academy Sayfasına Dön