Automatisation de l'utilisation de l'optimisation par profile de visual studio 2005/2008

Automatisation de l'utilisation de l'optimisation par Profile de Visual studio 2005

Par Gilles Vollant (MVP Visual C++)
info@winimage.com

Après avoir introduit l'option « Whole Program Optimisation » dans Visual studio 2002, Microsoft à introduit une nouvelle optimisation encore plus efficace dans Visual Studio 2005, l'optimisation guidée par profil. Il existe déjà une très bonne description technique de cette option (version originale anglaise), qu'il est conseillé de lire avant le présent article.

Cette optimisation présente néanmoins un inconvénient: la difficulté de l'automatiser, ce qui peut obliger à un travail manuel répétitif à chaque fois que l'on souhaite régénérer une version optimisée de son application. L'objet de cet article est de donner quelques conseils et outils pour automatiser ce travail.

Tout d'abord, il faut adapter l'application afin de pouvoir effectuer automatiquement un scénario représentatif utilisant les parties du code coûteuse en calcul. Si l'application est une application graphique, il peut être nécessaire d'ajouter une option non publique en ligne de commande afin d'effectuer un travail représentatif du coeur du moteur de calcul de l'application sans intervention utilisateur.

Pour cela nous allons construire un batch utilisant les options permettant de pilote une compilation en ligne de commande, et un petit utilitaire, PgoAdapt, modifiant automatiquement le projet (fichier .vcproj) pour sélectionner la phase de création d'application PGO. Ce batch sera à exécuter dans le contexte de variable du Visual studio 2005 (Menu Démarrer -> Tous les programmes -> Microsoft Visual studio 2005 -> Visual studio tools -> Visual Studio 2005 Command Prompt).

Etudions le batch pas à pas. Le batch compile une version avec l'optimisation PGO et une autre sans, à la fois en 64 bits et en 32 bits. Si vous n'avez pas installé le compilateur 64 ou si vous utilisez une version 32 bits de Windows, il faudra juste supprimer les lignes qui concernent spécifiquement la version 64 bits. Afin de ne pas alourdir la lecture, cet article ne reproduit que les lignes correspondantes à la compilation 32 bits.

Dans cet exemple, nous allons réaliser une compilation avec et sans PGO du compresseur AloneLZMA du LZMA SDK 4.43 (le moteur de compression utilisé par 7-zip). Les fichiers supplémentaires sont téléchargeables et à décompresser dans le même répertoire que le SDK LZma, le batch étant à exécuter dans le répertoire lzma443\C\7zip\Compress\LZMA_Alone.

Dans la première partie, nous supprimons les traces des compilations précédentes, et nous effectuons la compilation sans optimisation Pgo, et nous renommons le répertoire x86 en x86NoPgo, afin de conserver ces compilations à part.

@echo off
set file_test_cpr=zlib-1.2.3.tar
rd /S/Q x64
rd /S/Q Win32
rd /S/Q x64Pgo
rd /S/Q Win32Pgo
rd /S/Q x64NoPgo
rd /S/Q Win32NoPgo
@time /t
@echo Build >> build_perf.txt
@time /t >> build_perf.txt

"%VS80COMNTOOLS%\..\..\Common7\IDE\devenv.exe" AloneLZMA.sln /rebuild "Release|x64" /project AloneLZMA /out build_x64nopgo.txt
"%VS80COMNTOOLS%\..\..\Common7\IDE\devenv.exe" AloneLZMA.sln /rebuild "Release|Win32" /project AloneLZMA /out build_x86nopgo.txt
ren x64 x64NoPgo
ren Win32 Win32NoPgo

Ensuite, nous effectuons la première phase de la compilation avec optimisation PGO, c'est à dire Compilation en code instrumenté. L'utilitaire PgoAdapt modifie le projet .vcproj afin de compiler une application instrumentée, avant de lancer cette compilation :

PgoAdapt AloneLZMA.vcproj * 2

"%VS80COMNTOOLS%\..\..\Common7\IDE\devenv.exe" AloneLZMA.sln /rebuild "Release|Win32" /project AloneLZMA /out build_x86pgo.txt

La phase suivante est la formation du code instrumenté : l'application est appelée pour exécuter les scénarios. Il est évidemment possible de lancer plusieurs fois l'application avec des paramètres différents, si cela permet d'exécuter plusieurs scénarios complémentaire. (On aura alors un fichier .PGC différents par scénario différents).

REM : for access to PGO DLL
CALL "%VS80COMNTOOLS%\..\..\VC\vcvarsall.bat" x86
start /wait Win32\AloneLZMA\release\lzma e %file_test_cpr% to_be_deleted
del to_be_deleted

La dernière phase, la recompilation en code optimisé, est appelée lorsque toutes les instrumentations ont été effectuée. De nouveau, PgoAdapt modifie le projet, avant d'appeler Visual studio. Notons que l'option /build et non /rebuild est utilisée, car il est évidement indispensable de garder le résultat des étapes précédentes. Le fichier exécutable instrumenté est auparavant renommé, affin que ce /build provoque la recréation d'un exécutable.

PgoAdapt AloneLZMA.vcproj * 3
ren Win32\AloneLZMA\release\lzma.exe *.exePgo
"%VS80COMNTOOLS%\..\..\Common7\IDE\devenv.exe" AloneLZMA.sln /build "Release|Win32" /project AloneLZMA /out build_x86pgo.txt

PgoAdapt est appelé une dernière fois, afin de remettre le projet dans le mode de compilation normale, et nous renommons le répertoire x86 en x86Pgo.

PgoAdapt AloneLZMA.vcproj * 1
ren x64 x64Pgo
ren Win32 Win32Pgo

L'exécution d'une compression d'un fichier de 260 Mo, nettement plus gros que le fichier utiliser pour le profil nous permet de mesurer les gains

version WPO version PGO Gain
Processeur Intel Core 2 Duo - 32 bits 144 sec 131 sec 9 %
Processeur Intel Core 2 Duo - 64bits 125 sec 119 sec 5 %
Processeur Amd Athlon 64 - 32 bits 257 sec 239 sec 7 %
Processeur Amd Athlon 64 - 64 bits 211 sec 202 sec 4 %

Le gain n'est pas négligeable. Evidemment, il est étroitement dépendant du type de code, et du choix adapté du jeux de fichier de traitement à faire exécuter, comme cela est décrit dans les articles concernant l'optimisation PGO cités plus haut.

Un outil pour l'automatisation : PgoAdapt

PgoAdapt, utilisé dans le batch décrit plus haut, permet d'effectuer automatiquement la modification du projet qui correspond au changement de mode "Profile Guided optimisation" dans l'interface graphique de Visual Studio 2005. C'est un utilitaire très simple qui se contente de modifier la valeur de la variable WholeProgramOptimization="#" dans le fichier .vcproj.

Il est évidemment fortement conseillé de sauvegarder le fichier .vcproj avant de le faire modifier par PgoAdapt. Il est indispensable que le projet soit déjà basculé en mode « Whole Program Optimisation », sinon PgoAdapt n'aura aucun effet.

PgoAdapt 1.00 - Gilles Vollant 2007 - http://www.winimage.com/misc/PgoAdapt

Usage:
PgoAdapt [project.vcproj] #
Where [project.vcproj] is filename of a Visual Studio 2005 project
# = 1 : for standard LTCG (without Profile-Guided Optimization)
# = 2 : for instrument PGO project
# = 3 : for optimize PGO project
# = 4 : for update PGO project

Ce document intitulé « Automatisation de l'utilisation de l'optimisation par profile de visual studio 2005/2008 » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.