PgoAutoSweep
A PgoAutoSweep
salva as informações do contador de perfil atual em um arquivo e, em seguida, redefine os contadores. Use a função durante o treinamento de otimização guiada por perfil para gravar todos os dados de perfil do programa em execução em um arquivo .pgc
para uso posterior no build de otimização.
Sintaxe
void PgoAutoSweep(const char* name); // ANSI/MBCS
void PgoAutoSweep(const wchar_t* name); // UNICODE
Parâmetros
name
Uma cadeia de caracteres de identificação para o arquivo salvo .pgc
.
Comentários
Você pode chamar PgoAutoSweep
em seu aplicativo para salvar e redefinir os dados de perfil a qualquer momento durante a execução do aplicativo. Em um build instrumentado, PgoAutoSweep
captura os dados de criação de perfil atuais, salva-os em um arquivo e redefine os contadores de perfil. É o equivalente a chamar o comando pgosweep em um ponto específico no executável. Em um build otimizado, PgoAutoSweep
é um não operacional.
Os dados salvos do contador de perfil são colocados em um arquivo chamado base_name-name!value.pgc, em que base_name é o nome de base do executável, name é o parâmetro passado para PgoAutoSweep
, e value é um valor exclusivo, geralmente um número crescente de maneira monotônica, para evitar colisões de nome de arquivo.
Os arquivos .pgc
criados por PgoAutoSweep
devem ser mesclados em um arquivo .pgd
a ser usado para criar um executável otimizado. Você pode usar o comando pgomgr para executar a mesclagem.
Você pode passar o nome do arquivo mesclado .pgd
para o vinculador durante o build de otimização usando o argumento PGD=filename para a opção do vinculador /USEPROFILE ou usando a opção de vinculador /PGD preterida. Se você mesclar os arquivos .pgc
em um arquivo chamado base_name.pgd, não precisará especificar o nome do arquivo na linha de comando, pois o vinculador escolherá esse nome de arquivo por padrão.
A função PgoAutoSweep
mantém a configuração thread-safe especificada quando o build instrumentado é criado. Se você usar a configuração padrão ou especificar o argumento NOEXACT para a opção do vinculador /GENPROFILE ou /FASTGENPROFILE, as chamadas não PgoAutoSweep
serão thread-safe. O argumento EXACT cria um executável instrumentado thread-safe e mais preciso, mas mais lento.
Requisitos
Rotina | Cabeçalho necessário |
---|---|
PgoAutoSweep |
<pgobootrun.h> |
O executável deve incluir o arquivo pgobootrun.lib nas bibliotecas vinculadas. Esse arquivo está incluído na instalação do Visual Studio, no diretório de bibliotecas do VC para cada arquitetura com suporte.
Exemplo
O exemplo a seguir usa PgoAutoSweep
para criar dois arquivos .pgc
em pontos diferentes durante a execução. O primeiro contém os dados que descrevem o comportamento do runtime até que count
seja igual a 3 e o segundo contém os dados coletados após esse ponto, até pouco antes do encerramento do aplicativo.
// 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");
}
Em um prompt de comando do desenvolvedor, compile o código para um arquivo-objeto usando este comando:
cl /c /GL /W4 /EHsc /O2 pgoautosweep.cpp
Em seguida, gere um build instrumentado para treinamento usando este comando:
link /LTCG /genprofile pgobootrun.lib pgoautosweep.obj
Execute o executável instrumentado para capturar os dados de treinamento. A saída de dados das chamadas a PgoAutoSweep
são salvas em arquivos chamados pgoautosweep-func1!1.pgc e pgoautosweep-func2!1.pgc. A saída do programa deve ter esta aparência enquanto ele é executado:
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
Mescle os dados salvos em um banco de dados de treinamento de perfil, executando o comando pgomgr:
pgoautosweep-func1!1.pgc pgoautosweep-func2!1.pgc
A saída desse comando é semelhante ao seguinte:
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.
Agora você pode usar esses dados de treinamento para gerar um build otimizado. Use este comando para criar o executável otimizado:
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