0Pricing
C++ Academy · Lezione

Predizione dei branch e cicli hot

Aiuti la CPU a prevedere i branch e scriva cicli che il compilatore possa ottimizzare

Predizione dei branch e cicli hot è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Il predittore di branch

Le CPU moderne prevedono l’istruzione successiva prima che termini quella precedente. Quando la previsione è errata, la pipeline si arresta, con un costo di 10-20 cicli.

Branch prevedibili

I branch che seguono quasi sempre la stessa direzione, oppure uno schema chiaro, vengono previsti correttamente. I branch casuali hanno un impatto catastrofico.

I dati ordinati aiutano

Iterare dati ordinati con una condizione è spesso più veloce che iterare dati non ordinati: il predittore impara lo schema.

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

Codice branchless

Quando possibile, sostituisca i branch con operazioni aritmetiche. La CPU valuta entrambi i percorsi e seleziona il risultato senza eseguire un branch.

// 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); }

std::max come scelta migliore

I compilatori moderni producono spesso automaticamente codice branchless. Scriva semplicemente codice chiaro e lasci lavorare l’ottimizzatore, ma controlli il disassemblato nei percorsi critici.

Hint likely e unlikely

C++20 ha aggiunto [[likely]] e [[unlikely]] per fornire un suggerimento al compilatore.

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

Srotolamento dei cicli

Eseguire più lavoro per iterazione riduce la frequenza dei branch. I compilatori moderni srotolano i cicli autonomamente; utilizzi #pragma unroll solo quando le misurazioni dimostrano che è utile.

Eviti carichi di lavoro misti nei cicli

Un ciclo con due casi che si alternano casualmente vanifica la previsione. Quando possibile, lo divida in due cicli, uno per ciascun caso.

// 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]);

Inserisca inline le funzioni hot

L’overhead della chiamata a una funzione può essere paragonabile al corpo della funzione nei cicli hot. Gli hint inline sono utili; __attribute__((always_inline)) (GCC/Clang) è più rigido.

Non si fidi dell’intuito

I compilatori e le CPU sono molto sofisticati. Misuri prima di ottimizzare. La versione branchless «ovvia» potrebbe essere più lenta di quella con branch una volta che il predittore è stato addestrato.

SIMD per cicli ad ampia elaborazione

L’autovettorizzazione trasforma un ciclo in istruzioni SIMD quando è possibile. Utilizzi codice pulito e tipi semplici, ed eviti dipendenze tra le iterazioni.

Ottimizzazione guidata dal profiling (PGO)

Compili, esegua il programma, raccolga i dati di profiling e ricompili con gli hint. I compilatori utilizzano questi dati per prevedere meglio quali branch sono hot.

Verifica rapida

Perché ordinare i dati prima di un ciclo di filtraggio può talvolta accelerare l’esecuzione?

Riepilogo

I branch previsti erroneamente costano cicli. Mantenga i branch prevedibili, perché i dati ordinati aiutano; utilizzi gli hint likely/unlikely, suddivida i carichi di lavoro per mantenere uniformi i cicli e si affidi al compilatore per l’ottimizzazione, salvo prova contraria del profiling.

Domande Frequenti

La lezione «Predizione dei branch e cicli hot» è gratuita?

Sì — il testo completo di «Predizione dei branch e cicli hot» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Predizione dei branch e cicli hot»?

Aiuti la CPU a prevedere i branch e scriva cicli che il compilatore possa ottimizzare Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Predizione dei branch e cicli hot»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Layout dei dati ottimizzato per la cache
  2. Predizione dei branch e cicli hot
  3. Profilazione con perf, VTune e Sanitizer
  4. Microbenchmark con Google Benchmark
← Torna a C++ Academy