PgoAutoSweep
PgoAutoSweep
enregistre les informations actuelles du compteur de profil dans un fichier, puis réinitialise les compteurs. Utilisez la fonction pendant l’apprentissage de l’optimisation guidée par profil pour écrire toutes les données de profil du programme en cours d’exécution dans un .pgc
fichier pour une utilisation ultérieure dans la build d’optimisation.
Syntaxe
void PgoAutoSweep(const char* name); // ANSI/MBCS
void PgoAutoSweep(const wchar_t* name); // UNICODE
Paramètres
nom
Chaîne d’identification pour le fichier enregistré .pgc
.
Notes
Vous pouvez appeler PgoAutoSweep
à partir de votre application pour enregistrer et réinitialiser les données de profil à tout moment pendant l’exécution de l’application. Dans une build instrumentée, PgoAutoSweep
capture les données de profilage actuelles, les enregistre dans un fichier et réinitialise les compteurs de profil. Il s’agit de l’équivalent de l’appel de la commande pgosweep à un point spécifique de votre exécutable. Dans une build optimisée, PgoAutoSweep
il s’agit d’une opération sans opération.
Les données de compteur de profil enregistrées sont placées dans un fichier nommé base_name-nom !value.pgc, où base_name est le nom de base de l’exécutable, le nom est le paramètre passé à PgoAutoSweep
, et la valeur est une valeur unique, généralement un nombre monotonique croissant, pour empêcher les collisions de noms de fichier.
Les .pgc
fichiers créés par PgoAutoSweep
doivent être fusionnés dans un .pgd
fichier à utiliser pour créer un exécutable optimisé. Vous pouvez utiliser la commande pgomgr pour effectuer la fusion.
Vous pouvez transmettre le nom du fichier fusionné .pgd
à l’éditeur de liens pendant la build d’optimisation à l’aide de l’argument PGD=filename à l’option /USEPROFILE Linker, ou à l’aide de l’option /PGD linker déconseillée. Si vous fusionnez les .pgc
fichiers dans un fichier nommé base_name.pgd, vous n’avez pas besoin de spécifier le nom de fichier sur la ligne de commande, car l’éditeur de liens récupère ce nom de fichier par défaut.
La PgoAutoSweep
fonction gère le paramètre de sécurité des threads spécifié lors de la création de la build instrumentée. Si vous utilisez le paramètre par défaut ou spécifiez l’argument NOEXACT pour l’option /GENPROFILE ou /FASTGENPROFILE linker, les appels à PgoAutoSweep
ne sont pas thread-safe. L’argument EXACT crée un exécutable instrumenté thread-safe et plus précis, mais plus lent.
Spécifications
Routine | En-tête requis |
---|---|
PgoAutoSweep |
<pgobootrun.h> |
L’exécutable doit inclure le fichier pgobootrun.lib dans les bibliothèques liées. Ce fichier est inclus dans votre installation de Visual Studio, dans le répertoire des bibliothèques VC pour chaque architecture prise en charge.
Exemple
L’exemple ci-dessous utilise PgoAutoSweep
pour créer deux fichiers à des .pgc
points différents pendant l’exécution. La première contient des données qui décrivent le comportement d’exécution jusqu’à count
ce qu’elle soit égale à 3, et la seconde contient les données collectées après ce point jusqu’à juste avant l’arrêt de l’application.
// pgoautosweep.cpp
// Compile by using: cl /c /GL /W4 /EHsc /O2 pgoautosweep.cpp
// Link to instrument: link /LTCG /genprofile pgobootrun.lib pgoautosweep.obj
// Run to generate data: pgoautosweep
// Merge data by using command line pgomgr tool:
// pgomgr /merge pgoautosweep-func1!1.pgc pgoautosweep-func2!1.pgc pgoautosweep.pgd
// Link to optimize: link /LTCG /useprofile pgobootrun.lib pgoautosweep.obj
#include <iostream>
#include <windows.h>
#include <pgobootrun.h>
void func2(int count)
{
std::cout << "hello from func2 " << count << std::endl;
Sleep(2000);
}
void func1(int count)
{
std::cout << "hello from func1 " << count << std::endl;
Sleep(2000);
}
int main()
{
int count = 10;
while (count--)
{
if (count < 3)
func2(count);
else
{
func1(count);
if (count == 3)
{
PgoAutoSweep("func1");
}
}
}
PgoAutoSweep("func2");
}
Dans une invite de commandes développeur, compilez le code dans un fichier objet à l’aide de cette commande :
cl /c /GL /W4 /EHsc /O2 pgoautosweep.cpp
Générez ensuite une build instrumentée pour l’entraînement à l’aide de cette commande :
link /LTCG /genprofile pgobootrun.lib pgoautosweep.obj
Exécutez l’exécutable instrumenté pour capturer les données d’apprentissage. La sortie des données par les appels à PgoAutoSweep
est enregistrée dans des fichiers nommés pgoautosweep-func1!1.pgc et pgoautosweep-func2!1.pgc. La sortie du programme doit ressembler à ceci lors de son exécution :
hello from func1 9
hello from func1 8
hello from func1 7
hello from func1 6
hello from func1 5
hello from func1 4
hello from func1 3
hello from func2 2
hello from func2 1
hello from func2 0
Fusionnez les données enregistrées dans une base de données d’entraînement de profil en exécutant la commande pgomgr :
pgoautosweep-func1!1.pgc pgoautosweep-func2!1.pgc
La sortie de cette commande ressemble à ceci :
Microsoft (R) Profile Guided Optimization Manager 14.13.26128.0
Copyright (C) Microsoft Corporation. All rights reserved.
Merging pgoautosweep-func1!1.pgc
pgoautosweep-func1!1.pgc: Used 3.8% (22304 / 589824) of total space reserved. 0.0% of the counts were dropped due to overflow.
Merging pgoautosweep-func2!1.pgc
pgoautosweep-func2!1.pgc: Used 3.8% (22424 / 589824) of total space reserved. 0.0% of the counts were dropped due to overflow.
Vous pouvez maintenant utiliser ces données d’apprentissage pour générer une build optimisée. Utilisez cette commande pour générer l’exécutable optimisé :
link /LTCG /useprofile pgobootrun.lib pgoautosweep.obj
Microsoft (R) Incremental Linker Version 14.13.26128.0
Copyright (C) Microsoft Corporation. All rights reserved.
Merging pgoautosweep!1.pgc
pgoautosweep!1.pgc: Used 3.9% (22904 / 589824) of total space reserved. 0.0% of the counts were dropped due to overflow.
Reading PGD file 1: pgoautosweep.pgd
Generating code
0 of 0 ( 0.0%) original invalid call sites were matched.
0 new call sites were added.
294 of 294 (100.00%) profiled functions will be compiled for speed
348 of 1239 inline instances were from dead/cold paths
294 of 294 functions (100.0%) were optimized using profile data
16870 of 16870 instructions (100.0%) were optimized using profile data
Finished generating code