Su un Pentium moderno non è più possibile dare suggerimenti di ramificazione al processore che sembra. Supponendo che un compilatore di profili come gcc con ottimizzazione guidata dal profilo ottenga informazioni sul probabile comportamento di ramificazione, cosa può fare per produrre codice che verrà eseguito più rapidamente?Cosa può fare un compilatore con le informazioni di diramazione?
L'unica opzione che conosco è spostare rami improbabili alla fine di una funzione. C'è niente altro?
Aggiornamento .
http://download.intel.com/products/processor/manual/325462.pdf del volume 2 bis, sezione 2.1.1 dice
"prefissi Branch suggerimento (2EH, 3EH) consentono a un programma per dare un suggerimento per il processore sul percorso di codice più probabile per un ramo. Usare questi prefissi solo con istruzioni condizionali di ramo (Jcc). Altro uso di prefissi di suggerimento di ramo e/o altri codici opzionali indefiniti con le istruzioni di Intel 64 o IA-32 è riservato, tale uso può causare un comportamento imprevedibile di ".
Non so se questi hanno comunque alcun effetto.
D'altra parte sezione 3.4.1. . Di http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf dice
" compilatori generano codice che migliora l'efficienza di predizione dei salti in processori Intel Intel C++ compilatore esegue ciò:
- codice tenuta e dati su pagine separate
- utilizzando condizionale sposta le istruzioni per eliminare le diramazioni
- codice di generazione coerente con l'algoritmo di predizione di ramo statico
- inlining ove appropriato
- srotolando se il numero di iterazioni è prevedibile
Con ottimizzazione del profilo-guida, il compilatore può porre dei blocchi di base per eliminare rami per la maggior percorsi eseguite frequentemente di una funzione o almeno migliorarne la prevedibilità. La previsione della filiale deve essere non essere un problema al livello sorgente. Per ulteriori informazioni, consultare la documentazione del compilatore Intel C++. "
http://cache-www.intel.com/cd/00/00/40/60/406096_406096.pdf dice in 'Miglioramenti di prestazioni con PGO'
" PGO funziona meglio per il codice con molti rami eseguiti spesso difficili da prevedere in fase di compilazione. Un esempio è il codice con controllo degli errori intensivo in cui le condizioni di errore sono false per la maggior parte delle volte . Il codice di errorhandling (a freddo) eseguito raramente può essere riposizionato in modo che il ramo venga raramente previsto in modo errato. Minimizzare codice freddo intercalati nel codice eseguito frequentemente (caldo) migliora cache istruzioni comportamento ".
Sapete quali compilatori fanno effettivamente una di queste cose? Ad esempio, gcc? – marshall