Ottimizzazioni PGO (Profile Guided Optmization)

L'ottimizzazione PGO (Profile-Guided Optimization) consente di ottimizzare un intero file eseguibile, in cui Optimizer usa i dati dalle esecuzioni di test del file .exe o .dll. I dati rappresentano le probabili prestazioni del programma in un ambiente di produzione.

Le ottimizzazioni guidate dal profilo sono disponibili solo per le destinazioni native x86, x64 o ARM64. Le ottimizzazioni guidate dal profilo non sono disponibili per i file eseguibili eseguiti in Common Language Runtime. Anche se si produce un assembly con codice nativo e gestito misto (usando l'opzione del compilatore /clr ), non è possibile usare l'ottimizzazione guidata dal profilo solo nel codice nativo. Se si tenta di compilare un progetto con queste opzioni impostate nell'IDE, viene restituito un errore di compilazione.

Nota

Le informazioni raccolte dalle esecuzioni dei test di profilatura sostituiscono le ottimizzazioni che altrimenti verrebbero applicate se si specifica /Ob, /Os o /Ot. Per altre informazioni, vedere /Ob (espansione della funzione inline) e /Os, /Ot (Favor Small Code, Favor Fast Code) .For more information, see /Ob (Inline Function Expansion) and /Os, /Ot (Favor Small Code, Favor Fast Code).

Passaggi per ottimizzare l'app

Per usare l'ottimizzazione guidata dal profilo, seguire questa procedura per ottimizzare l'app:

  • Compilare uno o più file di codice sorgente con /GL.

    Ogni modulo compilato con /GL può essere esaminato durante le esecuzioni dei test di ottimizzazione guidata dal profilo per acquisire il comportamento di runtime. Ogni modulo in una compilazione di ottimizzazione guidata dal profilo non deve essere compilato con /GL. Tuttavia, solo i moduli compilati con /GL vengono instrumentati e successivamente disponibili per le ottimizzazioni guidate dal profilo.

  • Collegamento tramite /LTCG e /GENPROFILE o /FASTGENPROFILE.

    L'uso di /LTCG e /GENPROFILE o /FASTGENPROFILE crea un .pgd file quando viene eseguita l'app instrumentata. Dopo aver aggiunto i dati di esecuzione del test al .pgd file, è possibile usarli come input per il passaggio di collegamento successivo (creazione dell'immagine ottimizzata). Quando si specifica /GENPROFILE, è possibile aggiungere facoltativamente un argomento PGD=filename per specificare un nome o un percorso non predefiniti per il .pgd file. La combinazione di opzioni del linker /LTCG e /GENPROFILE o /FASTGENPROFILE sostituisce l'opzione deprecata /LTCG:PGINSTRUMENT linker.

  • Profilare l'applicazione.

    Ogni volta che termina una sessione EXE profilata o viene scaricata una DLL profilata, viene creato un appname!N.pgc file. Un .pgc file contiene informazioni su una determinata esecuzione di test dell'applicazione. appname è il nome dell'app e N è un numero che inizia con 1 che viene incrementato in base al numero di altri appname!N.pgc file nella directory. È possibile eliminare un .pgc file se l'esecuzione del test non rappresenta uno scenario da ottimizzare.

    Durante un'esecuzione di test, è possibile forzare la chiusura del file attualmente aperto .pgc e la creazione di un nuovo .pgc file con l'utilità pgosweep , ad esempio quando la fine di uno scenario di test non coincide con l'arresto dell'applicazione.

    L'applicazione può anche richiamare direttamente una funzione PGO, PgoAutoSweep, per acquisire i dati del profilo al momento della chiamata come .pgc file. Può fornire un controllo più corretto sul codice coperto dai dati acquisiti nei .pgc file. Per un esempio di come usare questa funzione, vedere la documentazione di PgoAutoSweep .

    Quando si crea la compilazione instrumentata, per impostazione predefinita, la raccolta dei dati viene eseguita in modalità non thread-safe, che è più veloce ma può essere imprecisa. Usando l'argomento EXACT per /GENPROFILE o /FASTGENPROFILE, è possibile specificare la raccolta dei dati in modalità thread-safe, più precisa, ma più lenta. Questa opzione è disponibile anche se si imposta la variabile di ambiente PogoSafeMode deprecata o l'opzione del linker /POGOSAFEMODE deprecata quando si crea la compilazione instrumentata.

  • Collegare con /LTCG e /USEPROFILE.

    Usare entrambe le opzioni del linker /LTCG e /USEPROFILE per creare l'immagine ottimizzata. Questo passaggio accetta come input il .pgd file. Quando si specifica /USEPROFILE, è possibile aggiungere facoltativamente un argomento PGD=filename per specificare un nome o un percorso non predefinito per il .pgd file. È anche possibile specificare questo nome usando l'opzione deprecata /PGD linker. La combinazione di /LTCG e /USEPROFILE sostituisce le opzioni deprecate /LTCG:PGOPTIMIZE e /LTCG:PGUPDATE linker.

È anche possibile creare il file eseguibile ottimizzato e successivamente determinare che sarebbe utile creare un'immagine più ottimizzata. Se l'immagine instrumentata e il relativo .pgd file sono disponibili, è possibile eseguire altre esecuzioni di test e ricompilare l'immagine ottimizzata con il file più recente .pgd , usando le stesse opzioni del linker /LTCG e /USEPROFILE .

Nota

Entrambi .pgc i file e .pgd sono tipi di file binari. Se archiviato in un sistema di controllo del codice sorgente, evitare qualsiasi trasformazione automatica che può essere eseguita nei file di testo.

Ottimizzazioni eseguite da PGO

Le ottimizzazioni guidate dal profilo includono questi controlli e miglioramenti:

  • Inlining : ad esempio, se una funzione A chiama spesso la funzione B e la funzione B è relativamente piccola, le ottimizzazioni guidate dal profilo B nella funzione A.

  • Speculazione di chiamata virtuale: se una chiamata virtuale o un'altra chiamata tramite un puntatore di funzione, spesso è destinata a una determinata funzione, un'ottimizzazione guidata dal profilo può inserire una chiamata diretta eseguita in modo condizionale alla funzione di destinazione frequente e la chiamata diretta può essere inlined.

  • Registra allocazione : ottimizzazione basata sui dati del profilo comporta una migliore allocazione dei registri.

  • Ottimizzazione blocchi di base: l'ottimizzazione di base dei blocchi consente l'esecuzione temporale di blocchi di base eseguiti in modo temporaneamente all'interno di un determinato frame nello stesso set di pagine (località). Riduce al minimo il numero di pagine usate, riducendo al minimo il sovraccarico di memoria.

  • Ottimizzazione dimensioni/velocità: le funzioni in cui il programma impiega il tempo di esecuzione più elevato possono essere ottimizzate per la velocità.

  • Layout funzione: in base al grafico delle chiamate e al comportamento chiamato del chiamante profilato, le funzioni che tendono a trovarsi lungo lo stesso percorso di esecuzione vengono posizionate nella stessa sezione.

  • Ottimizzazione del ramo condizionale: con i probe dei valori, le ottimizzazioni guidate dal profilo possono trovare se un determinato valore in un'istruzione switch viene usato più spesso di altri valori. Quindi è possibile effettuare il pull di questo valore dall'istruzione switch. Lo stesso può essere fatto con if...else istruzioni in cui l'ottimizzatore può ordinare if...else in modo che il if blocco o else venga posizionato per primo, a seconda del blocco è più frequente true.

  • Separazione del codice non terminata: il codice non chiamato durante la profilatura viene spostato in una sezione speciale aggiunta alla fine del set di sezioni. Mantiene in modo efficace questa sezione dalle pagine usate di frequente.

  • Separazione del codice EH: poiché il codice EH viene eseguito solo in modo eccezionale, spesso può essere spostato in una sezione separata. Viene spostato quando le ottimizzazioni guidate dal profilo possono determinare che le eccezioni si verificano solo in condizioni eccezionali.

  • Oggetti intrinseci della memoria: indica se espandere un intrinseco o meno dipende dal fatto che venga chiamato frequentemente. Un intrinseco può inoltre essere ottimizzato in base alle dimensioni dei blocchi di spostamenti o di copie.

Passaggi successivi

Altre informazioni su queste variabili di ambiente, funzioni e strumenti che è possibile usare nelle ottimizzazioni guidate dal profilo:

Variabili di ambiente per le ottimizzazioni guidate dal profilo
Queste variabili sono state usate per specificare il comportamento di runtime degli scenari di test. Sono ora deprecati e sostituiti da nuove opzioni del linker. Questo documento illustra come passare dalle variabili di ambiente alle opzioni del linker.

PgoAutoSweep
Una funzione che è possibile aggiungere all'app per fornire un controllo di acquisizione dei dati di file con granularità .pgc fine.

pgosweep
Utilità della riga di comando che scrive tutti i dati del profilo nel .pgc file, chiude il .pgc file e apre un nuovo .pgc file.

pgomgr
Utilità della riga di comando che aggiunge i dati del profilo da uno o più .pgc file al .pgd file.

Procedura: Unire più profili PGO in un singolo profilo
Esempi di utilizzo di pgomgr .

Vedi anche

Strumenti di compilazione aggiuntivi MSVC