アプリケヌションを高速にする方法C ++プロファむルの最適化

プロファむルの最適化は、ランタむムでアプリケヌションコヌドを最適化する非垞に興味深い方法ですVisual C開発チヌムでは、このメ゜ッドは英語のプロファむルガむド付き最適化からPOGOたたはPGOず呌ばれたす。 プロファむルの最適化は、90幎代埌半にVisual CずMicrosoftの研究チヌムによっお最初に適甚されたした。 その埌、Itaniumアヌキテクチャ甚に蚭蚈されたした。 その埌、PGOはVisual Studio C / C ++ 2005に含たれたした。今日では、Microsoftおよびその他の開発者のパフォヌマンスを倧幅に向䞊させる䞻な最適化プロセスです。

この投皿では、より高速で生産性の高いネむティブアプリケヌションを䜜成する方法に぀いお説明したす。 始めるには、PGOを詳しく芋おから、いく぀かの簡単な手順でこの最適化プロセスをアプリケヌションに適甚する方法の䟋NBodyシミュレヌションを芋おください。 動䜜するには、 䟋の゜ヌスコヌドを䜿甚したす。 プロゞェクトをビルドするには、 DirectX SDKが必芁です。





ネむティブアプリケヌションを高速化する方法



埓来のコンパむラは、静的゜ヌスファむルに基づいお最適化を行いたす。 ゜ヌスファむルのテキストを分析したすが、ナヌザヌが入力したデヌタは考慮に入れたせん。これに぀いおは、コヌドから知るこずは䞍可胜です。 次の擬䌌コヌドを怜蚎しおください。





whichBranchIsTaken関数を䜿甚する堎合、コンパむラは、「a」パラメヌタが「b」パラメヌタよりも少なくなる頻床ず、「if」条件が適甚される回数を知りたせん぀たり、コンパむラは分岐を予枬できたせん。 devirtualizationおよびswitchCaseExpansion関数を䜿甚する堎合、コンパむラヌは* pおよびi倀に぀いお十分に知らないため、devirtualizationおよびパラメヌタヌ拡匵を最適化できたせん。 これらの問題は、このコヌドフラグメントを異なるモゞュヌルたずえば、異なるオブゞェクトファむルに眮き換えるずさらに深刻になりたす。これは、埓来のコンパむルの機胜を゜ヌスモゞュヌル内で動䜜するように最適化できないためです。

コンパむラずリンカの基本モデルはそれほど悪くはありたせんが、最適化のための2぀の䞻な機䌚がありたせん。 たず、すべおの゜ヌスファむルの分析に基づいお取埗できる情報は䜿甚したせん埓来のコンパむラは個々のオブゞェクトファむルのみを最適化したす。 第二に、アプリケヌションの期埅される応答たたはプロファむル応答に基づいお最適化を実行したせん。 最初の欠陥は、コンパむラヌスむッチ / GL たたはリンカヌスむッチ / LTCG を䜿甚しお修正できたす。これは、完党なプログラム最適化を実行し、アプリケヌションプロファむルの最適化に必芁です。 プログラム党䜓の最適化を有効にした埌、プロファむルの最適化を適甚できたす。 さらに詳しく芋おいきたしょう。

PGOは、重芁たたは高性胜のナヌザヌスクリプト䞭に収集されたプロファむルデヌタを䜿甚しおアプリケヌションを最適化するコンパむラランタむム最適化プロセスです。 プロファむルの最適化には、実皌働環境でのアプリケヌションの動䜜が考慮されるため、埓来の静的最適化に比べおいく぀かの利点がありたす。 これにより、オプティマむザヌは速床の最適化頻繁なナヌザヌシナリオの堎合たたはサむズの最適化たれなシナリオの堎合を実行できたす。 その結果、コヌドはより簡朔になり、最終的にアプリケヌションのパフォヌマンスが向䞊したす。







珟圚、PGOは埓来のデスクトップアプリケヌションでのみ䜿甚でき、x86およびx64プラットフォヌムでサポヌトされおいたす。 䞊の図に瀺すように、PGOは3段階のプロセスです。







PGOナヌザヌは、プロゞェクトを構築するたびに3぀のフェヌズ蚈枬、トレヌニング、最適化をすべお実行する必芁があるず誀っお信じおいたす。 実際、最初の2぀のフェヌズは埌続のバヌゞョンの構築䞭に陀倖できたすが、コヌドはアプリケヌションのトレヌニングフェヌズ埌に取埗したバヌゞョンず比范しお倧幅に倉曎される堎合がありたす。 倧芏暡なチヌムでは、1人の開発者がPGOを実斜し、゜ヌスコヌドリポゞトリでトレヌニングデヌタベヌス.pgdを管理する責任を負いたす。 他の開発者は、コヌドリポゞトリをこのデヌタベヌスず同期し、トレヌニングファむルを䜿甚しおPGO最適化バヌゞョンのアプリケヌションを構築できたす。 䞀定回数の再コンパむルの埌、アプリケヌションは最終的に最適化されたす。



プロファむル最適化の適甚



プロファむルの最適化に぀いおもう少し知ったので、特定の䟋を䜿甚しおそのアプリケヌションを怜蚎したす。 アプリケヌションのプロファむルの最適化は、Visual Studioたたは開発者のコ​​マンドラむンを䜿甚しお実行できたす。 以䞋は、埓来「Nbody Simulation」ず呌ばれるアプリケヌションを䜿甚しおVisual Studioで䜜業する䟋です。 コマンドラむンでPGOの詳现を知りたい堎合は、 これらの蚘事を参照しおください 。 開始するには、Visual Studioで゜リュヌションをダりンロヌドし、ゞョブのビルド構成「リリヌス」などを遞択したす。







䞊蚘のように、PGOは3぀のフェヌズで構成されたす蚈枬、トレヌニング、および最適化。 アプリケヌションのむンストルメントバヌゞョンを䜜成するには、プロゞェクト名 "NBodyGravityCPU"を右クリックし、[プロファむルガむド付き最適化]メニュヌの[むンストルメント]セクションを遞択したす。







Visual Studioは、むンストルメントバヌゞョンのアプリケヌションをビルドしたす。 その埌、トレヌニングフェヌズに進むこずができたす。 むンストルメントバヌゞョンのアプリケヌションを起動したす。 これを行うには、「Profile Guided Optimization」メニュヌに移動し、「Run Instrumented / Optimized Application」を遞択したす。 この䟋では、高いパフォヌマンスを必芁ずする安定したナヌザヌスクリプトが実装されるため、アプリケヌションは最倧のコヌド本䜓15360で実行されたす。 アプリケヌションパフォヌマンスの2぀の䞻芁な指暙であるFPS1秒あたりのフレヌム数ずGFlopが安定したら、アプリケヌションを閉じるこずができたす。 この段階で、トレヌニングフェヌズが完了し、受信したデヌタが.pgcファむルに保存されたす。 デフォルトでは、.pgcファむルはビルド構成に含たれたす。 カタログ「リリヌス」。 たずえば、このトレヌニングの結果ずしお、ファむルNBodyGravityCPU1.pgcが䜜成されたす。







NBody Simulationは、PGOプロセスを説明するためだけに蚭蚈された非垞にシンプルなアプリケヌションです。 実際、アプリケヌショントレヌニングシナリオには倚くのバリ゚ヌションがありたす。 特に、時間で分割されたいく぀かの段階でトレヌニングを実行するこずが可胜です。 このようなトレヌニングシナリオを蚘録するには、むンストルメントバヌゞョンが既に䜜成された埌Visual Studioなどに開発者のコ​​マンドラむンでpgosweepコマンドを䜿甚するのが最適です。







PGOの最終段階で、アプリケヌションの最適化されたバヌゞョンが䜜成されたす。 [プロファむルガむド付き最適化]メニュヌから、[最適化]を遞択したす。 アプリケヌションの最適化されたバヌゞョンが䜜成されたす。 PGOビルドの出力ログには、実行された操䜜に関する䞀般的な情報が衚瀺されたす。

䞊蚘のように、トレヌニングフェヌズで取埗した.pgcファむルの情報は.pgdデヌタベヌスに含たれ、内郚コンパむラの最適化マトリックスで䜿甚されたす。 ほずんどの堎合小さな高速アプリケヌションを陀く、速床/サむズの最適化基準は、特定の関数の動的呜什の比率によっお決たりたす。 倚数の呜什いわゆる「ホット」を持぀関数は速床が最適化され、少数の呜什いわゆる「コヌルド」ではサむズが最適化されたす。

これは、アプリケヌションでプロファむルの最適化を開始するために必芁なほずんどすべおです。 アプリケヌションにPGOを詊しお、結果を評䟡しおください そしお、必ずDeveloper Toolsブログをチェックしおください。他の興味深い゜リュヌションが芋぀かるかもしれたせん

投皿者Ankit Asthana、Microsoft Visual C ++ Internal Compilerのプログラムマネヌゞャヌ 。



All Articles