ã€ã³ãã©ã°ã©ãã£ãã¯ïŒ
ã³ãŒããæé©åããå¿ èŠãããå Žåã¯ããããã¡ã€ã«ãäœæããŠç°¡çŽ åããå¿ èŠããããŸãã ãã ããæåããéå¹çãªããšãããªãããã«ïŒãããŠãã§ããã°ããã°ã©ã ãåŸã§ãããã¡ã€ãªã³ã°ããªãããã«ïŒãããã€ãã®äžè¬çãªæäœã®æŠç®ã³ã¹ããåçŽã«èŠã€ããããšãçã«ããªã£ãŠããå ŽåããããŸãã
CPUãµã€ã¯ã«ã§ã®ç¹å®ã®æäœã®ã³ã¹ããè©äŸ¡ããã®ã«åœ¹ç«ã€ã€ã³ãã©ã°ã©ãã£ãã¯-ãã¡ãã£ãšãL2ã®èªã¿åãæäœã«ã¯éåžžã©ããããã®è²»çšããããã®ïŒã ãããã®ãã¹ãŠã®è³ªåã«å¯Ÿããåçã¯å€ããå°ãªããç¥ãããŠããŸããããããããã¹ãŠäžèŠ§è¡šç€ºãããé è¿æ³ã§æ瀺ãããŠããåäžã®å Žæãç¥ããŸããã å³å¯ã«èšãã°ãèšèŒãããŠããã³ã¹ãã¯ææ°ã®x86 / x64ããã»ããµã«ã®ã¿é©çšãããŸããã倧èŠæš¡ãªãã«ãã¬ãã«ãã£ãã·ã¥ïŒARM Cortex AãSPARCãªã©ïŒãåããä»ã®ææ°ã®ããã»ããµã§ãåæ§ã®ã³ã¹ãæ¯ãèŠãããããšãäºæ³ãããŸãã äžæ¹ãMCUïŒARM Cortex Mãå«ãïŒã¯ãŸã£ããç°ãªããããäžéšã®ãã¿ãŒã³ãé©çšãããªãå ŽåããããŸãã
æåŸã«ãéèŠãªããšã§ãããèŠåïŒããã§ã®ãã¹ãŠã®èŠç©ããã¯é åºã瀺ããŠããã ãã§ãã ãã ããããŸããŸãªæäœã®éãã®å€§ãããèãããšããããã®æ瀺ã¯åŒãç¶ã䜿çšã§ããŸãïŒå°ãªããšããæ©ãããæ²èŠ³åãã¯é¿ããŠãã ããïŒã
äžæ¹ã§ããã¡ãã£ãšãä»®æ³é¢æ°ã®åŒã³åºãã¯äœã®äŸ¡å€ããªãããšèšããªããã°ããã®ãããªå³ã¯åœ¹ã«ç«ã€ãšç¢ºä¿¡ããŠããŸãã 代ããã«ãäžèšã®ã€ã³ãã©ã°ã©ãã£ãã¯ã䜿çšãããšã3 GHzã®åšæ³¢æ°ã®ããã»ããµã§ä»®æ³é¢æ°ãæ¯ç§100KåŒã³åºããšãããããããã»ããµã®ç·éã®0.2ïŒ ä»¥äžã®ã³ã¹ãã¯ããããŸããã ãã ããåãä»®æ³é¢æ°ãæ¯ç§10MåŒã³åºããšãä»®æ³åãããã»ããµã³ã¢ã®2æ¡ã®å²åãåžåããããšãç°¡åã«æå³ããå¯èœæ§ããããŸãã
åã質åã«è¿ã¥ããã1ã€ã®æ¹æ³ã¯ããã¡ãã£ãšã10,000ãµã€ã¯ã«ã®ã³ãŒãããšã«ä»®æ³é¢æ°ã1ååŒã³åºãã®ã§ãä»®æ³åã¯ããã°ã©ã ã®æéã®1ïŒ ä»¥äžãæ¶è²»ããŸããããšèšãããšã§ãããããã§ãäœããã®æ¹æ³ãå¿ èŠã§ãé¢é£ããã³ã¹ãã®å€§ããã®ãªãŒããŒãåç §ããŠãã ãã-äžèšã®ãã£ãŒãã¯åŒãç¶ãæçšã§ãã
次ã«ãäžèšã®ã€ã³ãã©ã°ã©ãã£ãã¯ã®ãã€ã³ãã詳ããèŠãŠã¿ãŸãããã
ALUããã³FPUæäœ
ç§ãã¡ã®ç®çã§ã¯ãALUæäœãšããã°ã倧æåãšå°æåãåºå¥ããªãæäœã®ã¿ãèæ ®ããŸãã ã¡ã¢ãªãé¢äžããŠããå Žåãã³ã¹ãã¯ãŸã£ããç°ãªãå¯èœæ§ããããŸãã以äžã«èª¬æããããã«ãã¡ã¢ãªã«ã¢ã¯ã»ã¹ãããšãã®ããã£ãã·ã¥ãã¹ã®å€§ãããã«äŸåããŸãã
ãç°¡åãªãæäœ
çŸåšïŒããã³ææ°ã®ããã»ããµïŒãADD / MOV / OR / ...ãªã©ã®ãåçŽãªãæäœã¯ãåäžã®CPUã¯ããã¯ãµã€ã¯ã«ãããç°¡åã«é«éã«å®è¡ã§ããŸãã ããã¯ãæäœãæåéãååã®ããŒå ã§å®è¡ãããããšãæå³ããŸããã ããã©ãããããã¹ãŠã®æäœã¯æŽæ°ã®ã¡ãžã£ãŒã§å®è¡ãããŸããããããã®äžéšã¯äžŠè¡ããŠå®è¡ã§ããŸã ã
[Agner4] ïŒã¡ãªã¿ã«ãIMHOã¯ããã»ããµæäœãè©äŸ¡ããããã®æè¯ã®ãªãã¡ã¬ã³ã¹ã¬ã€ãã§ãïŒã§ã¯ããã®æ©èœã¯åæäœãç¹åŸŽä»ãã2ã€ã®éã®ååšã«åæ ãããŸãã1ã€ã¯é 延ïŒåžžã«æŽæ°ã®ã¯ããã¯ãµã€ã¯ã«ã§è¡šãããŸãïŒããã1ã€ã¯ããã©ãŒãã³ã¹ã§ãã ãã ããçŸå®ã®äžçã§ã¯ãé åºã®æšå®ç¯å²ãè¶ ããå Žåãæ£ç¢ºãªæéã¯ããã°ã©ã ã®æ§è³ªãšãã³ã³ãã€ã©ãäžèŠç¡é¢ä¿ãªåœä»€ãæäŸããé åºã«å€§ããäŸåããããšã«æ³šæããŠãã ããã èŠããã«ãåŸ æ©é åºãããåªãããã®ãå¿ èŠãªå Žåã¯ãç¹å®ã®ã³ã³ãã€ã©ã§ã³ã³ãã€ã«ãããç¹å®ã®ããã°ã©ã ããããã¡ã€ã«ããå¿ èŠããããŸãïŒçæ³çã«ã¯ãç¹å®ã®ã¿ãŒã²ããããã»ããµã§ãïŒã
ãã®ãããªã¡ãœããã®è©³çŽ°ãªèª¬æïŒãã¢ãŠããªããªãŒããŒå®è¡ããšããŠç¥ãããŠããïŒã¯ãæ¬åœã«èå³æ·±ããã®ã§ãããããŒããŠã§ã¢æåãããŸãïŒã¢ãŠããªããªãŒããŒæäœã®å¹çãäœäžãããäŸåé¢ä¿ã®æ°ãæžããããã«ããã»ããµãââãŒãã®äžã§çºçãããã¬ãžã¹ã¿ã®åœåãã¯ã©ãã§ããããïŒïŒããããŠãæããã«çŸåšã®çŠç¹ã«ã¯ãããŸããã
æŽæ°ã®ä¹ç®/é€ç®
æŽæ°ã®ä¹ç®/é€ç®ã¯ãäžèšã®ãåçŽãªãæäœãšæ¯èŒããŠéåžžã«é«äŸ¡ã§ãã [ Agner4 ]ã¯ã1ã7ãµã€ã¯ã«ïŒå®éã«ã¯ã3ã6ãµã€ã¯ã«ãªã©ãããçãç¯å²ã®å€ã芳枬ããïŒã§32/64ãããä¹ç®ïŒM86 / x64ã®äžçã§ã¯MUL / IMULïŒã®ã³ã¹ããããã³32/64ãããã®ã³ã¹ããæšå®ããŸãé€ç®ïŒx86 / 64ã§ã¯DIV / IDIVãšããŠç¥ãããŠããŸãïŒ-çŽ12-44ãµã€ã¯ã«ã
æµ®åå°æ°ç¹æŒç®
æµ®åå°æ°ç¹æŒç®ã®ã³ã¹ãã¯[ Agner4 ]ããåããã å ç®ã§ã¯1ã3 CPUãµã€ã¯ã«ïŒFADD / FSUBïŒãä¹ç®ã§ã¯2-5ãµã€ã¯ã«ïŒFMULïŒããé€ç®ã§ã¯37-39ãµã€ã¯ã«ïŒFDIVïŒãŸã§å€åããŸãã
ã¹ã«ã©ãŒSSEæäœïŒããã¹ãŠã®ç¬ããä»æ¥äœ¿çšããŠããããã§ãïŒã䜿çšãããšãã€ã³ãžã±ãŒã¿ãŒã¯ä¹ç®ã§0.5-5ãµã€ã¯ã«ïŒMULSS / MULSDïŒãé€ç®ã§1-40ãµã€ã¯ã«ïŒDIVSS / DIVSDïŒ; ãã ããå®éã«ã¯ãé€ç®ã«ã¯10ã40ãµã€ã¯ã«ãäºæ³ããå¿ èŠããããŸãïŒ1ãµã€ã¯ã«ã¯å®éã«ã¯ãã£ãã«å®çŸãããªããçžäºåž¯åå¹ ãã§ãïŒã
128ãããã®ãã¯ãã«æŒç®
æ°å¹ŽéãCPUã¯ããã¯ãã«ãæäœïŒããæ£ç¢ºã«ã¯ãåäžåœä»€è€æ°ããŒã¿ãŸãã¯SIMDæäœïŒããµããŒãããŠããŸããã Intelã®äžçã§ã¯SSEããã³AVXãARMã®äžçã§ã¯ARM NeonãšããŠç¥ãããŠããŸãã ããŒã¿ã®ããã¯ãã«ãã§æ©èœããããŒã¿ãåããµã€ãºïŒSSE2-SSE4ã®å Žåã¯128ããããAVXããã³AVX2ã®å Žåã¯256ããããä»åŸã®AVX-512ã®å Žåã¯512ãããïŒãé¢çœãã®ã¯é¢çœãã§ãããããŸããŸãªæ¹æ³ã§è§£éã§ããŸãã ããšãã°ã128ãããã®SSE2ã¬ãžã¹ã¿ã¯ãïŒaïŒ2ã€ã®doubleãïŒbïŒ4ã€ã®floatã©2ã€ã®64ãããæŽæ°ãïŒdïŒ4ã€ã®32ãããæŽæ°ãïŒeïŒ8ã€ã®16ãããæŽæ°ãïŒf ïŒ16åã®8ãããæŽæ°ã
[ Agner4 ]ã¯ããã¯ãã«ã4Ã32ãããæŽæ°ãšããŠè§£éãããå Žåã¯<1ã¡ãžã£ãŒã§ã128ããããã¯ãã«äžã®æŽæ°å ç®ãæšå®ãã2Ã64ãããæŽæ°ã§ããå Žåã¯4ã¡ãžã£ãŒãæšå®ããŸãã ä¹ç®ïŒ4Ã32ãããïŒã¯1ã5ã¯ããã¯ãµã€ã¯ã«ãšæšå®ãããŸã-æåŸã«ãã§ãã¯ãããšããx86 / x64åœä»€ã»ããã«ã¯æŽæ°ãã¯ãã«é€ç®æŒç®ã¯ãããŸããã§ããã 128ããããã¯ãã«ã§ã®æµ®åå°æ°ç¹æŒç®ã¯ãå ç®ã§1ã3 CPUãµã€ã¯ã«ãä¹ç®ã§1ã7 CPUãµã€ã¯ã«ãæ倧17ã69ãµã€ã¯ã«ã®é€ç®ã§æšå®ãããŸãã
é·ç§»é 延
èšç®ã®ã³ã¹ãã«é¢é£ããæçœãªããšã¯ãæŽæ°åœä»€ãšæµ®ååœä»€ã®åãæ¿ããç¡æã§ã¯ãªããšããããšã§ã¯ãããŸããã [ Agner3 ]ã¯ãããã»ããµã«å¿ããŠ0ã3ã¯ããã¯ãµã€ã¯ã«ã§ãã®ã³ã¹ãïŒãé·ç§»é 延ããšåŒã°ããïŒãæšå®ããŸãã å®éãåé¡ã¯ããäžè¬çã§ãããïŒCPUã«å¿ããŠïŒãã¯ãã«ïŒSSEïŒæŽæ°åœä»€ãšéåžžã®ïŒã¹ã«ã©ãŒïŒæŽæ°åœä»€ãåãæ¿ãããšããã«ãã£ãçããå ŽåããããŸãã
æé©åã®ãã³ãïŒããã©ãŒãã³ã¹ãéèŠãªã³ãŒãã§ã¯ãæµ®åå°æ°ç¹ãšæŽæ°ã®èšç®ãçµã¿åãããªãã§ãã ããã
åå²
次ã«èª¬æããã®ã¯ãã³ãŒãã®åå²ã§ãã é·ç§»ïŒããã°ã©ã å ã®å ŽåïŒã¯ãåºæ¬çã«æ¯èŒãšåœä»€ã«ãŠã³ã¿ãŒã®å€æŽã§ãã ãããã¯äž¡æ¹ãšãåçŽã§ãããåå²ã¯éåžžã«é«äŸ¡ã«ãªãå¯èœæ§ããããŸãã ããããªããããªã®ããšããè°è«ã¯ããã¯ãããŒããŠã§ã¢æåã§ãïŒç¹ã«ããã€ãã©ã€ã³åŠçãšææ©çå®è¡ã«åœ±é¿ããŸãïŒãããœãããŠã§ã¢éçºè ã®èŠ³ç¹ããã¯ã次ã®ããã«ãªããŸãã
- ããã»ããµãå®è¡å ãæ£ããæšæž¬ããå ŽåïŒããã¯ifæ¡ä»¶ã®å®éã®èšç®ã®åã§ãïŒãé·ç§»ã³ã¹ãã¯çŽ1ã2 CPUãµã€ã¯ã«ã§ã
- ãã ããããã»ããµã誀ã£ãä»®å®ãè¡ããšãCPUããåæ¢ããããšããäºå®ã«ã€ãªãããŸãã
ãã®é 延ã®æç¶æéã¯ãææ°ã®Intelããã»ããµãŒã®å Žåã10ã20ã¯ããã¯ãµã€ã¯ã«ãšæšå®ãããŸã-çŽ15ã20ã¯ããã¯ãµã€ã¯ã«[ Agner3 ]ã
GCC __builtin_expectïŒïŒãã¯ãã¯åå²äºæž¬ã«åœ±é¿ãäžãããšèããããŠããŸããã15幎åã«ã¯ãã®ããã«æ©èœããŠããŸããããå°ãªããšãIntelããã»ããµãŒïŒCore 2以éããïŒãã®ïŒã
[ Agner3 ]ã§èª¬æãããŠããããã«ãææ°ã®Intelããã»ããµã§ã¯ãåå²äºæž¬ã¯åžžã«åçã§ãïŒãŸãã¯å°ãªããšãåçãªæ±ºå®ãæ¯é çã§ãïŒã ããã¯ã__ builtin_expectïŒïŒã³ãŒãããã®äºæ³ãããéžè±ãé·ç§»ã®äºæž¬ã«åœ±é¿ãäžããªãããšãæå³ããŸãïŒææ°ã®Intelããã»ããµãŒäžïŒã ãã ãã以äžã®ãã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ãã»ã¯ã·ã§ã³ã§èª¬æããããã«ã__ builtin_expectïŒïŒã¯äŸç¶ãšããŠã³ãŒãã®çææ¹æ³ã«åœ±é¿ããŸãã
ã¡ã¢ãªã¢ã¯ã»ã¹
80幎代ãããã»ããµé床ã¯ã¡ã¢ãªã¬ã€ãã³ã·ã«å¹æµããŸããïŒããšãã°ã4 MHzã§åäœããZ80ããã»ããµã¯ãã¬ãžã¹ã¿éåœä»€ã§4ã¯ããã¯ãµã€ã¯ã«ãã¬ãžã¹ã¿ãšã¡ã¢ãªéåœä»€ã§6ã¯ããã¯ãµã€ã¯ã«ãè²»ãããŸããïŒã åœæã¯ãã¢ã»ã³ããªãèŠãã ãã§ããã°ã©ã ã®é床ãèšç®ããããšãã§ããŸããã
ãã以éãããã»ããµã®é床ã¯3æ¡åäžããã¡ã¢ãªã®ã¬ã€ãã³ã·ã¯10ã30åçšåºŠããåäžããŠããŸããã æ®ãã®30ãè¶ ããäžæŽåã«å¯ŸåŠããããã«ããããã®ã¿ã€ãã®ãã£ãã·ã¥ã¯ãã¹ãŠå°å ¥ãããŸããã ææ°ã®ããã»ããµã«ã¯éåžžã3ã€ã®ãã£ãã·ã¥ã¬ãã«ããããŸãã ãã®çµæãã¡ã¢ãªãžã®ã¢ã¯ã»ã¹é床ã¯ããèªã¿åãããšããŠããããŒã¿ã¯ã©ãã«ããã®ãïŒããšãã質åã«å¯Ÿããçãã«å€§ããäŸåããŸãã ãªã¯ãšã¹ããèŠã€ãã£ããã£ãã·ã¥ã¬ãã«ãäœãã»ã©ãéãååŸã§ããŸãã
L1ããã³L2ãã£ãã·ã¥ã¢ã¯ã»ã¹æéã¯ã[Intel.Skylake]ãªã©ã®å ¬åŒããã¥ã¡ã³ãã«èšèŒãããŠããŸãã ãããã4/12/44ããã»ããµãµã€ã¯ã«ã§ã®L1 / L2 / L3ãžã®ã¢ã¯ã»ã¹æéãæšå®ããŸãïŒæ³šïŒãããã®æ°å€ã¯ãããã»ããµã¢ãã«ããšã«ãããã«ç°ãªããŸãïŒã äžè¬çã«ã[ Levinthal ]ã§è¿°ã¹ãããã«ããã£ãã·ã¥ãå¥ã®ã³ã¢ãšå ±æãããŠããå ŽåãL3ãžã®ã¢ã¯ã»ã¹æéã¯75ã¯ããã¯ãµã€ã¯ã«ã«éããå¯èœæ§ããããŸãã
ãã ããèŠã€ãã«ããã®ã¯ãã¡ã€ã³RAMãžã®ã¢ã¯ã»ã¹æéã«é¢ããæ å ±ã§ãã [ Levinthal ]ã¯ã60nsïŒããã»ããµã3GHzã§åäœããŠããå ŽåãçŽ180ã¯ããã¯ãµã€ã¯ã«ïŒãšæšå®ããŠããŸãã
æé©åã®ãã³ã ïŒããŒã¿ã®å±ææ§ãæ¹åããŸãã 詳现ã«ã€ããŠã¯ãããšãã°[ NoBugs ]ãåç §ããŠãã ããã
ã¡ã¢ãªããã®èªã¿åãã«å ããŠãæžã蟌ã¿ããããŸãã çŽèŠ³çã«ã¯ãæžãããšã¯èªãããšãããé«äŸ¡ã§ãããšèªèãããŠããŸããããããŠãã¯ããã§ã¯ãããŸããã ãã®çç±ã¯ç°¡åã§ããããã»ããµã¯ãèšé²ãå®äºããã®ãåŸ ã£ãŠããå ã«é²ãå¿ èŠã¯ãããŸããïŒä»£ããã«ãæžã蟌ã¿ãéå§ããã ãã§ãããã«ä»ã®ãã®ã«é²ã¿ãŸãïŒã ããã¯ãã»ãšãã©ã®å Žåãããã»ããµã1ã¯ããã¯ãµã€ã¯ã«ã§èšé²ã§ããããšãæå³ããŸãã ããã¯ç§ã®çµéšãšäžèŽããŠããã[ Agner4 ]ãšéåžžã«ããçžé¢ããŠããããã§ãã äžæ¹ãã·ã¹ãã ãã¡ã¢ãªåž¯åå¹ ã«é¢é£ä»ããããŠããå Žåãæ°å€ã¯éåžžã«å€§ãããªãå¯èœæ§ããããŸãã ããã«ãããããããç§ãèŠããã®ãããæžã蟌ã¿æäœã§ãã¹ããªãŒããŒããŒãããããšã¯éåžžã«ãŸããªããšãªã®ã§ããã€ã¢ã°ã©ã ã«åæ ããŸããã§ããã
ããŒã¿ã«å ããŠãã³ãŒãããããŸãã
ãã1ã€ã®æé©åã®ãã³ãïŒã³ãŒãã®å±ææ§ãæ¹åããŠãã ããã ããã¯ããã»ã©æçœã§ã¯ãããŸããïŒååãšããŠãããŒã¿ã®ããŒã«ãªãŒãŒã·ã§ã³ãäžååãªå Žåãããããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯å°ãªããªããŸãïŒã ã³ãŒãã®å±ææ§ãæ¹åããæ¹æ³ã®è°è«ã¯[ Drepper ]ã«ãããŸãã ãããã®ã¡ãœããã«ã¯ãã€ã³ã©ã€ã³åã__ builtin_expectïŒïŒãªã©ãå«ãŸããŸãã
äžèšã®ããã«__builtin_expectïŒïŒã¯Intelããã»ããµã§ã®é·ç§»ã®äºæž¬ã«ã¯åœ±é¿ããŸããããã³ãŒãã®ããŒã¯ã¢ããã«ã¯åœ±é¿ããã³ãŒãã®ç©ºéçå±ææ§ã«åœ±é¿ããããšã«æ³šæããŠãã ããã ãã®çµæã__ builtin_expectïŒïŒã¯ãææ°ã®Intelããã»ããµïŒARMã§ã¯-æ£çŽãªãšãããããããŸããïŒã§ã¯ããŸãã«ãé¡èãªå¹æã¯ãããŸããããããã§ãããã©ãŒãã³ã¹ã«ããçšåºŠåœ±é¿ããå¯èœæ§ããããŸãã MSVCã§ã¯ãæ¡ä»¶æŒç®åã®ifé·ç§»ãšelseé·ç§»ã__builtin_expectïŒïŒã«äŒŒãå¹æãããããããšãå ±åãããŠããŸãïŒææ¡ãããé·ç§»ã2ã€ã®é·ç§»ãæã€æ¡ä»¶æŒç®åã®ifé·ç§»ã§ããå ŽåïŒããããã¯çãããã¯ãã§ãã
NUMAïŒäžåçãªã¡ã¢ãªã¢ãŒããã¯ãã£ïŒ
ã¡ã¢ãªã¢ã¯ã»ã¹ãšããã©ãŒãã³ã¹ã«é¢é£ãããã1ã€ã®ããšã¯ããã¹ã¯ãããã³ã³ãã¥ãŒã¿ãŒã§ã¯ãã£ãã«èŠãããŸããïŒããã«ã¯ãã«ãããã»ããµãã·ã³ãå¿ èŠã§ã-ãã«ãã³ã¢ãã·ã³ãšæ··åããªãã§ãã ããïŒã ãããã£ãŠãäž»ã«ãµãŒããŒã®ãã©ãã£ã§ãã ãã ããããã¯ã¡ã¢ãªã¢ã¯ã»ã¹æéã«å€§ãã圱é¿ããŸãã
è€æ°ã®ãœã±ãããé¢ä¿ããå ŽåãçŸä»£ã®ããã»ããµã¯ããããNUMAã¢ãŒããã¯ãã£ãå®è£ ããåŸåããããåããã»ããµïŒãããã»ããµã=ããœã±ããã«æ¿å ¥ããããïŒã«ã¯ç¬èªã®RAMããããŸãïŒä»¥åã®FSBã¢ãŒããã¯ãã£ãšã¯ç°ãªããããã³ããµã€ããã¹ãšå ±æRAMïŒã åããã»ããµã¯ç¬èªã®RAMãæã£ãŠãããšããäºå®ã«ãããããããCPUã¯RAMã¢ãã¬ã¹ç©ºéãå ±æããŸã-ãããŠãç©ççã«å¥ã®RAMã«ã¢ã¯ã»ã¹ããå¿ èŠããããšãã¯ãã€ã§ããQPIãHypertransportãªã©ã®è¶ é«éãããã³ã«ãä»ããŠå¥ã®ãœã±ããã«ãªã¯ãšã¹ããéä¿¡ããããšã§è¡ãããŸãã
é©ããããšã«ãããªããäºæ³ããã»ã©é·ãã¯ãããŸãã-ããŒã¿ããªã¢ãŒãããã»ããµã®L3ãã£ãã·ã¥ã«ããå Žåã[ ã¬ãã³ã¿ã« ]ã¯100-300 CPUãµã€ã¯ã«ãæäŸããããŒã¿ãååšããªãå Žåã¯100nsïŒã= 300ãµã€ã¯ã«ïŒãšãªã¢ãŒãããã»ããµãæäŸããŸããã®ããŒã¿ã®ããã«ã¡ã€ã³RAMã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸããã
CASïŒäº€æãšã®æ¯èŒïŒ
æã ïŒç¹ã«ãéããããã³ã°ã¢ã«ãŽãªãºã ã§ããã¥ãŒããã¯ã¹ãå®è£ ãããšãïŒãããããã¢ãããã¯æäœã䜿çšããããšããããŸãã éåžžãCASïŒCompare-And-SwapïŒãšããŠç¥ããã1ã€ã®ã¢ãããã¯æäœã®ã¿ãåŠè¡çã«èæ ®ãããŸãïŒä»ã®ãã¹ãŠãCASãä»ããŠå®è£ ã§ãããšããçç±ã§ïŒã éåžžãå®éã«ã¯ãã£ãšå€ããããŸãïŒããšãã°ãC ++ 11ã®std :: atomicãWindowsã§ã¯Interlocked *ïŒïŒãGCC / Linuxã§ã¯__sync _ * _ããã³_ *ïŒïŒãåç §ããŠãã ããïŒã ãããã®æäœã¯ããªãå¥åŠãªåç©ã§ããç¹ã«ãé©åãªæäœã®ããã«ã¯ç¹å¥ãªCPUãµããŒããå¿ èŠã§ãã x86 / x64ã§ã¯ã察å¿ããASMåœä»€ã¯LOCKãã¬ãã£ãã¯ã¹ã«ãã£ãŠç¹åŸŽä»ãããããããx86 / x64äžã®CASã¯éåžžLOCK CMPXCHGãšèšè¿°ãããŸãã
çŸåšã®èŠ³ç¹ãããCASãªã©ã®ãããã®æäœã¯ãéåžžã®ã¡ã¢ãªã¢ã¯ã»ã¹ãããã¯ããã«é·ãå®è¡ãããããšãéèŠã§ãïŒååæ§ãä¿èšŒããããã«ãããã»ããµã¯ãå°ãªããšãç°ãªãã³ã¢éããŸãã¯ãã«ããœã±ããæ§æã®å Žåãç°ãªãã¡ã¢ãªéã§ãããã»ã¹ãåæããå¿ èŠããããŸããœã±ããïŒã
[ AlBahra ]ã¯ãCASæäœã®ã³ã¹ããçŽ15ã30ãµã€ã¯ã«ïŒx86ãšIBM Powerãã¡ããªãŒã§ãããã«ç°ãªãïŒã§èŠç©ãã£ãŠããŸãã ãã®æ°ã¯ã2ã€ã®ä»®å®ãæºããããå Žåã«ã®ã¿æ£åœåãããããšã«æ³šæãã䟡å€ããããŸããïŒaïŒã·ã³ã°ã«ã³ã¢æ§æã§äœæ¥ããŠããããšãããã³ïŒbïŒæ¯èŒããã¡ã¢ãªããã§ã«L1ã«ããããšã
ãã«ããœã±ããNUMAæ§æã§ã®CASã®ã³ã¹ãã«é¢ããŠã¯ãCASã§ããŒã¿ãèŠã€ããããšãã§ããªãã£ãã®ã§ãæšæž¬ãªãã§ã¯ã§ããŸããã äžæ¹ã§ãããªã¢ãŒããã¡ã¢ãªã®CASé 延ããœã±ããéã®HyperTransportåè·¯ãããå°ããããããšã¯ã»ãšãã©äžå¯èœã§ãããããã¯NUMA L3ãã£ãã·ã¥ãèªã¿åãã³ã¹ãã«å¹æµããŸãã
äžæ¹ããããã®ææšãè¶ ããçç±ã¯æ¬åœã«ãããŸãã:-)ã ãã®çµæã100ã300 CPUãµã€ã¯ã«ã§ã®NUMAã®åå¥ã®CASïŒããã³CASã«é¡äŒŒããïŒæäœã®ã³ã¹ããèŠç©ãããŸãã
TLBïŒé£æ³ç¿»èš³ãããã¡ãŒïŒ
ææ°ã®ããã»ããµãšææ°ã®OSã䜿çšããå Žåã¯åžžã«ãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§éåžžãä»®æ³ãã¢ãã¬ã¹ã¹ããŒã¹ãæ±ããŸãã ã€ãŸãã10åã®ããã»ã¹ãå®è¡ãããšããããã®åããã»ã¹ã¯ç¬èªã®ã¢ãã¬ã¹0x00000000ãæã€ããšãã§ããŸãïŒãããããããªããŸãïŒã ãã®åé¢ããµããŒãããããã«ãããã»ããµã¯ãããããä»®æ³ã¡ã¢ãªããå®è£ ããŠããŸãã x86ã®äžçã§ã¯ã1982幎ã«80286ã§å°å ¥ããããä¿è·ã¢ãŒããã«ãã£ãŠæåã«å®è£ ãããŸããã
éåžžããä»®æ³ã¡ã¢ãªãã¯ããŒãžããšã«æ©èœããŸãïŒx86ã®å ŽåãåããŒãžã®ãµã€ãºã¯4KãŸãã¯2MããŸãã¯å°ãªããšãçè«çã«ã¯1Gã§ãïŒïŒïŒïŒãCPUãå®è¡äžã®ããã»ã¹ãèªèããŠããå ŽåïŒïŒïŒãã¹ãŠã®ã¡ã¢ãªã¢ã¯ã»ã¹ã®ã¢ãã¬ã¹ã ãã¹ãŠã®ããã»ããµã¬ãžã¹ã¿ïŒããŒã¯ã¢ãããåŠçãããã®ãé€ãïŒããä»®æ³ã¡ã¢ãªã圢åŒã®ãã¹ãŠã®ãã€ã³ã¿ãå«ããšããæå³ã§ããã®åããŒãã³ã°ã¯å®å šã«èå°è£ã§è¡ãããããšã«æ³šæããŠãã ããã
ãããŠããããŒã¯ã¢ãããã«ã€ããŠè©±ãå§ããã®ã§ããã®ããŒã¯ã¢ããã«é¢ããæ å ±ã¯ã©ããã«ä¿åããå¿ èŠããããŸãã ããã«ããã®ããŒã¯ã¢ããïŒä»®æ³ã¢ãã¬ã¹ããç©çã¢ãã¬ã¹ãžïŒã¯ãã¹ãŠã®ã¡ã¢ãªã¢ã¯ã»ã¹ã§çºçãããããé«éã§ããå¿ èŠããããŸãã éåžžãããã«ã¯ç¹å¥ãªçš®é¡ã®ãã£ãã·ã¥ã䜿çšãããŸããããã¯ãAssociative Translation BufferïŒTLBïŒãšåŒã°ããŸãã
ä»ã®ã¿ã€ãã®ãã£ãã·ã¥ãšåæ§ã«ãTLBãã¹ã³ã¹ãããããŸãã x64ã®å Žåã7ã21 CPUãµã€ã¯ã«[ 7cpu ]ã®ç¯å²ã§ãã äžè¬ã«ãTLBã®åœ±é¿ã¯éåžžã«å°é£ã§ãã ãã ããããã€ãã®æšå¥šäºé ãåŒãç¶ãæäŸã§ããŸãã
- ç¹°ãè¿ããŸãããå šäœçãªã¡ã¢ãªã®å±ææ§ãæ¹åãããšãTLBãã¹ãæžããããšãã§ããŸãã ããŒã¿ã®ããŒã«ã«æ§ãé«ãã»ã©ãTLBãçµäºããå¯èœæ§ã¯äœããªããŸãã
- ãã©ãŒãžããŒãžãïŒx64ã®2 MBããŒãžïŒã®äœ¿çšãæ€èšããŠãã ããã ããŒãžã倧ããã»ã©ãå¿ èŠãªTLBã®ãšã³ããªãå°ãªããªããŸãã äžæ¹ãããã倧ããªããŒãžãã¯æ³šæããŠäœ¿çšããŠãã ãããããã¯äž¡åã®å£ã§ãã ããã¯ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠãã¹ãããå¿ èŠãããããšãæå³ããŸãã
- ASLRïŒ=ãã¢ãã¬ã¹ç©ºéå²ãåœãŠã®ã©ã³ãã åãïŒãç¡å¹ã«ããããšãæ€èšããŠãã ããã [ Drepper ]ã§èª¬æããããã«ãASLRãæå¹ã«ããããšã¯ã»ãã¥ãªãã£ã«ã¯é©ããŠããŸãããTLBãã¹ãªã©ãå«ãããã©ãŒãã³ã¹ãäœäžãããŸãã
ãœãããŠã§ã¢ããªããã£ã
ããã§ãããŒããŠã§ã¢ã«çŽæ¥é¢é£ããããšã¯å®äºããŸããããœãããŠã§ã¢ã«é¢é£ããããã€ãã®ããšã«ã€ããŠèª¬æããŸãã ãããã¯æ¬åœã«ã©ãã«ã§ãããã®ã§ã䜿çšãããã³ã«ã©ãã ã䜿ãããèŠãŠã¿ãŸãããã
C / C ++ã§ã®é¢æ°åŒã³åºã
æåã«ãC / C ++ã§é¢æ°ãåŒã³åºãã³ã¹ããèŠãŠã¿ãŸãããã å®éãC / C ++ã§é¢æ°ãåŒã³åºããã®ã¯ãåŒã³åºãåã«å€ãã®ããšãå°çã§è¡ããåŒã³åºãå ãé»ã£ãŠåº§ã£ãŠããŸããã
[ Efficient C ++ ]ã¯ããã©ã¡ãŒã¿ãŒã®æ°ã«å¿ããŠ25ã250ã¯ããã¯ãµã€ã¯ã«ã§é¢æ°ãåŒã³åºãããã®CPUã³ã¹ããæšå®ããŸãã ããããããã¯ããªãå€ãæ¬ã§ãããç§ã¯åãå£åŸã®ããè¯ãåç §ãæã£ãŠããŸããã äžæ¹ãç§ã®çµéšã§ã¯ããã©ã¡ãŒã¿ãŒã®æ°ãããªãå°ãªãé¢æ°ã®å Žåãããã¯ãããã15ã30ãµã€ã¯ã«ã«ãªããŸãã [ eruskin ]ãçºèŠããããã«ãããã¯Intel以å€ã®ããã»ããµãŒã«ãåœãŠã¯ãŸãããã§ãã
æé©åã®ãã³ãïŒå¿ èŠã«å¿ããŠã€ã³ã©ã€ã³é¢æ°ã䜿çšããŸãã ãã ããæè¿ã§ã¯ãã³ã³ãã€ã©ã¯ã»ãšãã©ã®å Žåãçµã¿èŸŒã¿ä»æ§ãç¡ââèŠããŸãã ãããã£ãŠãéåžžã«éèŠãªã³ãŒãã¹ããããã®å ŽåãGCCã«ã¯__attribute __ïŒïŒalways_inlineïŒïŒã䜿çšããMSVCã«ã¯__forceinlineã䜿çšããŠå¿ èŠãªåŠçãå®è¡ã§ããŸãã ãã ããããã»ã©éèŠã§ã¯ãªãã³ãŒãã¹ããããã«ãããã®åŒ·å¶ã€ã³ã©ã€ã³ã䜿çšããªãã§ãã ãããããã«ãããããã«æªåããå¯èœæ§ããããŸãã
ãšããã§ãå€ãã®å Žåãåã蟌ã¿ããåŸãããå©çã¯ãåã«é話ãåé€ããã³ã¹ããè¶ ããå ŽåããããŸãã ããã¯ãåã蟌ã¿ã«ããããªãã®æ°ã®è¿œå ã®æé©åïŒããŒããŠã§ã¢ãã€ãã©ã€ã³ã®é©åãªäœ¿çšãä¿èšŒããããã®äžŠã¹æ¿ãã«é¢é£ãããã®ãå«ãïŒãæäŸããããšããäºå®ã«ãããã®ã§ãã ãŸããåã蟌ã¿ã«ããã³ãŒãã®ç©ºéçå±ææ§ãåäžããããšãå¿ããªãã§ãã ãããããã¯å°ã圹ç«ã¡ãŸãïŒããšãã°[ Drepper ]ãåç §ïŒã
éæ¥åŒã³åºããšä»®æ³åŒã³åºã
äžèšã®èª¬æã¯ãéåžžã®ïŒãçŽæ¥ãïŒé¢æ°åŒã³åºãã«é¢é£ããŠããŸããã éæ¥åŒã³åºããšä»®æ³åŒã³åºãã®ã³ã¹ãã¯é«ãããšãç¥ãããŠãããå€ãã®äººã¯éæ¥åŒã³åºããåå²ãåŒãèµ·ããããšã«åæããŸãïŒãã ããåãã³ãŒããã€ã³ãããåãé¢æ°ãåŒã³åºãéãã[ Agner1 ]ã§ç€ºãããŠããããã«ãææ°ã®ããã»ããµã®é·ç§»äºæž¬ã¡ã«ããºã ã¯ãããéåžžã«ããäºæž¬ã§ããŸããããããªããšã10ã30ã¯ããã¯ãµã€ã¯ã«ã®èª€ã£ãäºæž¬ã«å¯ŸããŠããã«ãã£ãçºçããŸãïŒã ä»®æ³åŒã³åºãã«é¢ããŠã¯ãããã¯1åã®è¿œå èªã¿åãïŒVMTãã€ã³ã¿ãŒã®èªã¿åãïŒã§ããããããã®æç¹ã§ãã¹ãŠãïŒéåžžã©ããïŒãã£ãã·ã¥ãããå Žåãããã«4ããã»ããµãŒãµã€ã¯ã«çšåºŠã«ã€ããŠè©±ããŸãã
äžæ¹ãå®çšçãªæž¬å®[ eruskin ]ã¯ãä»®æ³é¢æ°ã®ã³ã¹ããå°ããªé¢æ°ã®çŽæ¥åŒã³åºãã®ã³ã¹ãã®çŽååã§ããããšã瀺ããŠããŸãã 誀差ç¯å²ïŒãé åºãïŒå ã§ãããã¯äžèšã®åæãšäžèŽããŠããŸãã
æé©åã®ãã³ã ïŒä»®æ³åŒã³åºããé«äŸ¡ãªå Žåã¯ã代ããã«C ++ã§ãã³ãã¬ãŒãã®äœ¿çšïŒããããã³ã³ãã€ã«æããªã¢ãŒãã£ãºã ã®å®è£ ïŒãæ€èšã§ããŸãã CRTPã¯ããããè¡ãå¯äžã®æ¹æ³ã§ãïŒå¯äžã®æ¹æ³ã§ã¯ãããŸããïŒã
é å
ä»æ¥ãã¢ãã±ãŒã¿ãŒã¯éåžžã«é«éã§ãã ç¹ã«ãtcmallocãšptmalloc2ã¢ãã±ãŒã¿ãŒã¯ãå°ããªãªããžã§ã¯ã[ TCMalloc ]ã®å²ãåœãŠ/解æŸã«200ã500 CPUãµã€ã¯ã«ãã䜿çšã§ããŸããã
ãã ããå²ãåœãŠã«é¢é£ããéèŠãªèŠåããããå²ãåœãŠã䜿çšããéæ¥çãªã³ã¹ãã«è¿œå ãããŸãïŒå²ãåœãŠã¯ãå€ãè¯ãçµéšåã®ããã«ãã¡ã¢ãªã®å±ææ§ã®äœäžãæå³ãããããããã©ãŒãã³ã¹ã«æªåœ±é¿ãåãŒããŸãïŒçžäºäœçšã®ããïŒäžèšã®éãã£ãã·ã¥ã¡ã¢ãªã䜿çšïŒã ãããå®éã«ã©ãã»ã©æªããã説æããããã«ã[ NoBugs ]ã®20è¡ã®ããã°ã©ã ãèŠãŠã¿ãŸãããã ãã®ããã°ã©ã ã¯ããã¯ã¿ãŒ<>ã䜿çšããå Žåããªã¹ã<>ã䜿çšããåçã®ããã°ã©ã ããã100ãã780åé«éã«å®è¡ãããŸãïŒã³ã³ãã€ã©ãŒãšç¹å®ã®ãã£ãŒã«ãã«äŸåããŸãïŒã
æé©åã®ãã³ã ïŒããã°ã©ã ã®å²ãåœãŠæ°ãæžããããšãæ€èšããŠãã ãããç¹ã«ãã»ãšãã©ã®äœæ¥ãèªã¿åãå°çšããŒã¿ã§è¡ããã段éãããå Žåã¯èããŠãã ããã å Žåã«ãã£ãŠã¯ãããŒã¿æ§é ã®å¹³æ»åïŒã€ãŸããéžæãããªããžã§ã¯ããããã¯ããããªããžã§ã¯ãã«çœ®ãæããïŒã«ãããããã°ã©ã ãæ倧5åé«éåã§ããŸãã
ãããã¯ã«é¢ããå®éã®ã¹ããŒãªãŒã æã ãã®ã¬ãã€ãã®RAMã䜿çšããããã°ã©ã ããããŸããããããã¯å€§ãããããšèããããŠããŸããã ããããŸãããç§ã¯ãããããã©ããåãããŒãžã§ã³ã«æžãçŽããŸããïŒã€ãŸããåããŒãã¯æåã«åçã«æ§ç¯ããã次ã«åçã®èªã¿åãå°çšããã©ããåããªããžã§ã¯ããã¡ã¢ãªã«äœæãããŸããïŒã ãã¹ã ãŒãžã³ã°ãã®ã¢ã€ãã¢ã¯ãã¡ã¢ãªã®éãæžããããšã§ããã ããã°ã©ã ãéå§ãããšãã¡ã¢ãªéã2åæžå°ããã ãã§ãªãïŒäºæ³ã©ããïŒãéåžžã«è¯ãå¯äœçšã®ããã«ãå®è¡é床ã5åå¢å ããããšãããããŸããã
OSã«ãŒãã«åŒã³åºã
ç§ãã¡ã®ããã°ã©ã ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§åäœããå ŽåïŒã¯ãããããªãã§ãåäœããããã°ã©ã ããŸã ãããŸãïŒãã·ã¹ãã APIã®ã°ã«ãŒãå šäœããããŸãã å®éã«ã¯ïŒå°ãªããšãéåžžã®OSã«ã€ããŠè©±ããŠããå ŽåïŒããããã®ã·ã¹ãã ã³ãŒã«ã®å€ãã¯ã«ãŒãã«ã³ãŒã«ã«ã€ãªãããŸããããã«ã¯ãã«ãŒãã«ã¢ãŒããžã®åãæ¿ãããã®éãå«ãŸããŸãã ããã«ã¯ãç°ãªããä¿è·ãªã³ã°ãéã®åãæ¿ãïŒIntelããã»ããµãŒã§ã¯ãéåžžããªã³ã°3ããšããªã³ã°0ãã®éïŒãå«ãŸããŸãã ããã»ããµã¬ãã«ã®åãæ¿ãã«ã¯çŽ100ã¯ããã¯ãµã€ã¯ã«ããããããŸããããããã«é¢é£ããä»ã®ãªãŒããŒãããã¯éåžžã«ãŒãã«ã³ãŒã«ãã¯ããã«é«äŸ¡ã«ãããããéåžžã®ã«ãŒãã«ã³ãŒã«ã«ã¯å°ãªããšã1000-1500ããã»ããµãµã€ã¯ã«ããããŸã[ Wikipedia.ProtectionRing ]ã
C ++äŸå€
çŸåšãC ++äŸå€ã¯ãæ©èœãããŸã§äŸ¡å€ããªããšèšãããŠããŸãã ããã¯æ¬åœã«äœããããŸãã-ããã¯ãŸã 100ïŒ æ確ã§ã¯ãããŸããïŒIMOã¯ãã®ãããªè³ªåããŸã£ããå°ãããããã©ããããæ確ã§ã¯ãããŸããïŒããããã¯ç¢ºãã«éåžžã«è¿ãã§ãã
ãã ãããããã®ãã³ã¹ãããããããŸã äœæ¥ãè¡ããªããå®è£ ã¯ãäŸå€ãçºçãããã³ã«å®è¡ããå¿ èŠãããèšå€§ãªäœæ¥ã®èåŸã«ãããŸãã ã¹ããŒãããäŸå€ã®ã³ã¹ãã¯è«å€§ã§ããããšã«èª°ããåæããŸãããïŒãã€ãã®ããã«ïŒå®éšããŒã¿ã¯ã»ãšãã©ãããŸããã ãã ãã[ Ongaro ]å®éšã§ã¯ãçŽ5,000ããã»ããµãµã€ã¯ã«ïŒãã¹ãïŒïŒã®ããããã®æ°ãåŸãããŸãã ããã«ãããè€éãªã±ãŒã¹ã§ã¯ããã®æ°å€ã¯ããã«å€§ãããªããšäºæ³ãããŸãã
ãšã©ãŒã®è¿åŽãšæ€èšŒ
äŸå€ã®äžæçãªä»£æ¿æ¹æ³ã¯ããšã©ãŒã³ãŒããè¿ããåã¬ãã«ã§ãã§ãã¯ããããšã§ãã ãã®çš®ã®ããã©ãŒãã³ã¹æž¬å®ã«ã€ããŠã¯èšåããŠããŸããããåççãªå®éšãè¡ãã®ã«ååãªããšã¯ãã§ã«ããã£ãŠããŸãã ããã詳ããèŠãŠã¿ãŸãããïŒãšã©ãŒãçºçããå Žåã®ããã©ãŒãã³ã¹ã«ã€ããŠã¯ããŸãæ°ã«ããŸããã®ã§ããã¹ãŠãæ£åžžã§ããå Žåã¯è©äŸ¡ã«éäžããŸãïŒã
ååãšããŠãè¿åããã³ç¢ºèªè²»çšã¯3ã€ã®åå¥ã®è²»çšã§æ§æãããŸãã ãããã®æåã®ãã®ã¯æ¡ä»¶ä»ãé·ç§»èªäœã®ã³ã¹ãã§ããã99 +ïŒ ã®å Žåã«æ£ããäºæž¬ããããšå®å šã«ä»®å®ã§ããŸãã ã€ãŸãããã®å Žåã®æ¡ä»¶ä»ããžã£ã³ãã®ã³ã¹ãã¯çŽ1ã2ãµã€ã¯ã«ã§ãã 2çªç®ã®ã³ã¹ãã¯ãšã©ãŒã³ãŒããã³ããŒããã³ã¹ãã§ããããããã¬ãžã¹ã¿å ã«ããéããããã¯åçŽãªMOVã§ãããããã®ç¶æ³ã§ã¯ã0ã1ã¯ããã¯ãµã€ã¯ã«ã§ãïŒ0ã¯ããã¯ãµã€ã¯ã«ã¯ãMOVã«è¿œå ã³ã¹ãããªãããšãæå³ããŸããä»ã®æäœãšäžŠè¡ããŠå®è¡ãããŸãïŒã 3çªç®ã®ã³ã¹ãã¯ããã»ã©æçœã§ã¯ãããŸãã-ããã¯ããšã©ãŒã³ãŒããéã¶ããã«å¿ èŠãªè¿œå ã®ã¬ãžã¹ã¿ã®ã³ã¹ãã§ãã â PUSH/POP ( ), , + L1 1 + 4 . , , PUSH/POP , ; , x86 ; x64 ( ) , PUSH/POP , ( , , , PUSH/POP).
, ---- ( ) 1 7 . , , , 10000 , , , ; , 100 , , , . , â « ».
, , , , . , . , « » (, , nginx Apache), « »?
10000 ; , . , , , « ». [ LiEtAl ], .
- â , 2000 (3 , )
- ; ; [ LiEtAl ], 3M . , , 12M L3 ( 50 ) 10M ; , 1M [LiEtAl] . « » x64 ( 4000, Windows/x64): 4000 ( , , 15-20 . , 40-50K , ), ----- â , , 4000 , , â , , --------------.
, , .
, , ( ), , , , - â , .
çµãã
,