ãããã¡ã€ã«ã®æé©åã¯
ãã©ã³ã¿ã€ã ã§ã¢ããªã±ãŒã·ã§ã³ã³ãŒããæé©åããéåžžã«èå³æ·±ãæ¹æ³ã§ãïŒ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段éã®ããã»ã¹ã§ãã
- éåžžãæåã®æ®µéã¯èšæž¬ãã§ãŒãºãšåŒã°ããŸãã ãã®ãã§ãŒãºã§ã¯ãã³ã³ãã€ã«ãã©ã°ã®ç¹å®ã®ã»ããã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ãããŸãã ãã«ãããã»ã¹äžã«ãå
éšã³ã³ãã€ã©ã¯ã次ã®ã¹ãããã§å¿
èŠãªãã¬ãŒãã³ã°ããŒã¿ãèšé²ããããã«äœ¿çšãããçæãããã³ãŒãã«ãã¹ãåœä»€ïŒãããŒãïŒãè¿œå ããŸãã åèšã§ã3çš®é¡ã®ãããŒããè¿œå ãããŸãïŒé¢æ°ã®ãšã³ããªãé·ç§»ãããã³å€ïŒã é¢æ°å
¥åãããŒãã¯ãé¢æ°ãèŠæ±ãããé »åºŠã枬å®ããŸãã 移è¡ãããŒãã䜿çšãããšãç¹å®ã®ã³ãŒããã©ã³ãã«å°éããåæ°ã調ã¹ãããšãã§ããŸãã ãããã£ãŠããã¬ãŒãã³ã°ãã§ãŒãºäžã«ãã³ã³ãã€ã©ã¯ãæå®ããããã¬ãŒãã³ã°ã¹ã¯ãªããã®ã³ãŒããã©ã³ãwhichBranchisTakenã®ãa> bãã®é »åºŠã«é¢ããæ
å ±ãåãåããŸãã å€ãããŒãã䜿çšãããšãå€ã®ãã¹ãã°ã©ã ãäœæããããã®ããŒã¿ãååŸã§ããŸãã ããšãã°ãswitchCaseExpansionã³ãŒãã¹ããããã«è¿œå ãããå€ãããŒãã¯ãã¹ã€ããã±ãŒã¹iã€ã³ããã¯ã¹å€æ°ã®å€ã®ãã¹ãã°ã©ã ãæ§ç¯ããããã®ããŒã¿ãæäŸããŸãã ãã¬ãŒãã³ã°äžã«å€æ°ãiãã®å€ã«é¢ããæ
å ±ãåãåããšãã³ã³ãã€ã©ã¯æãäžè¬çãªå€ãšswitchCaseExpansionãªã©ã®é¢æ°ã«å¯ŸããŠæé©åã§ããããã«ãªããŸãã ãããã£ãŠããã§ãŒãºã®çµããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ãã«ã¡ã³ãããŒãžã§ã³ïŒãããŒãä»ãïŒãšç©ºã®ããŒã¿ããŒã¹ãã¡ã€ã«ïŒ.pgdïŒãããã次ã®ãã§ãŒãºã§ååŸããæ
å ±ãå
¥åãããŸãã
- åŠç¿ãã§ãŒãº ã ãã®ãã§ãŒãºã§ã¯ããŠãŒã¶ãŒã¯ã€ã³ã¹ãã«ã¡ã³ãããŒãžã§ã³ã®ã¢ããªã±ãŒã·ã§ã³ãèµ·åããé«ãããã©ãŒãã³ã¹ãå¿
èŠãšããæšæºãŠãŒã¶ãŒã¹ã¯ãªãããåçããŸãã åºåã«ã¯ãããŸããŸãªãŠãŒã¶ãŒã·ããªãªã«é¢é£ããæ
å ±ãå«ã.pgcãã¡ã€ã«ããããŸãã åŠç¿ããã»ã¹ã§ã¯ãæ
å ±ã¯æåã®ãã§ãŒãºã§è¿œå ããããããŒããééããŸãã åºåã§ã¯ãpgc-files appnameïŒïŒïŒappnameã¯ã¢ããªã±ãŒã·ã§ã³ã®ååã«å¯Ÿå¿ããïŒ-1 + pgc-files appnameã®æ°ïŒïŒãã«ãã®åºåãã£ã¬ã¯ããªã«ãããŸãïŒãååŸããŸãã
- PGOã®æåŸã®ãã§ãŒãºã¯æé©åã§ãã ãã®ãã§ãŒãºã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æé©åãããããŒãžã§ã³ãäœæãããŸãã ããã«ããã¬ãŒãã³ã°ãã§ãŒãºã§ååŸããpgcãã¡ã€ã«ããã®æ
å ±ã¯ãã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³äžã«äœæãããããŒã¿ããŒã¹ïŒ.pgdãã¡ã€ã«ïŒã«ããã¯ã°ã©ãŠã³ãã§å
¥åãããŸãã å
éšã³ã³ãã€ã©ã¯ããã®ããŒã¿ããŒã¹ã䜿çšããŠã³ãŒããããã«æé©åããã¢ããªã±ãŒã·ã§ã³ã®ããã«é«åºŠãªããŒãžã§ã³ãæ§ç¯ããŸãã
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ã®
ããã°ã©ã ãããŒãžã£ãŒ ã