
䞊è¡æ§ã®äœ¿çšã¯ãçŸåšã§ã¯äžè¬çãªããã°ã©ãã³ã°ææ³ã§ãã ãã ãããã¹ãŠã®èšèªã¯2ã€ã®ã¿ã€ãã«åããããšãã§ããŸããmightãšmainã§äžŠååŠçã䜿çšãããèšèªïŒCãªã©ïŒãšããã«ãã¹ã¬ããã®æ¥œããããŸã ååã«å³ãã£ãŠããªãèšèªã§ãã ç¹ã«åŸè ã«ã¯JavaScriptãå«ãŸããŸãã ãã®è¿·æãªã®ã£ãããåããããã°ã¬ãã·ããšã¯ã¹ããªãšã³ã¹ã®ç®±ãåããããã«ãMozilla Foundationããã°ã©ããŒã§ããNick Matsakisã®ããã°ããã®ã¡ãã»ãŒãžã®ç¿»èš³ãæäŸããŸãã
æè¿ãJSã§ããŒã¿ã䞊ååããããŒã«ãšããŠIntelãæäŸãã補åã§ããRivertrailã䜿ãå§ããŸããã ãããŸã§ã®ãããžã§ã¯ãã§ã¯ãè¯å®çãªå°è±¡ããæ®ããŠããŸããã åæããŒãžã§ã³ã¯Intelã®ä»æ§ã«çµã³ä»ããããŸãããPJã®ãã¬ãŒã ã¯ãŒã¯å ã§äœæãããä»ã®ãããžã§ã¯ããšçµã¿åãããããšãå¯èœã«ãªãããšãé¡ã£ãŠããŸãã
ãããŒçšãªããŒãã¬ã€ã«
以äžã¯ããã®è£œåã«ã€ããŠèããããšããªã人åãã®ç°¡åãªçŽ¹ä»ã§ããRivertrailã¯ãã¢ã¬ã€ã䞊ååŠçã§ããä»æ§ã§ãã ä»æ§ã®åºæ¬ã¯ã ParallelArrayã¯ã©ã¹ã®è¿œå ã§ãã ãããã®é åã«ã¯ãJSé åãšããã€ãã®éèŠãªéãããããŸãã- 圌ãã¯å€ãããªã
- ééããªã
- å€æ¬¡å ã«ããããšãã§ããŸãããå€æ¬¡å ã¯ãæ£ãããïŒããšãã°ã2次å ãããªãã¯ã¹ã§ã¯ãåã®æ°ã¯è¡ã®æ°ã«çãããªããŸãïŒã
䞊åé åã¯ã ïŒïŒmapãïŒïŒreduceãªã©ã®ããªãå€æ°ã®é«ã¬ãã«æäœããµããŒãããŠããŸãã å®å šãªãªã¹ãã¯ã Rivertrailã®ä»æ§ã«èšèŒãããŠããŸãã ãããã®ã¡ãœããã¯åŒæ°ãšããŠé¢æ°ãåããéåžžã®JSé åã®å¯Ÿå¿ããé¢æ°ãšã»ãšãã©åãããã«æ©èœããŸãã ããã€ãã®éèŠãªéãã«å ããŠïŒ
- ãŸããåŒæ°ãšããŠäœ¿çšãããé¢æ°ã¯ãåžžã«ãçŽç²ãã§ããå¿ èŠããããŸãã詳现ã¯ä»¥äžãåç §ããŠãã ããã
- 次ã«ãå¯èœã§ããã°ãJSãšã³ãžã³ã¯ãããã®æ©èœã䞊è¡ããŠå®è¡ããããšããŸãã
çŽç²ãªæ©èœ
ãããã¯ãå ±æç¶æ ãå€æŽããªãéåžžã®JSé¢æ°ã§ãã ããã¯ãé¢æ°ããŸã£ããå€æŽã§ããªãããšãæå³ãããã®ã§ã¯ãããŸãããé¢æ°èªäœã«ãã£ãŠå²ãåœãŠãããããŒã«ã«å€æ°ãšãªããžã§ã¯ãã¯å€æŽã§ããŸããããšãã°ããã³ãã«ããéåãèšç®ããé¢æ°ã¯çŽç²ã§ãïŒ
function mandelbrot(x, y) { var Cr = (x - 256) / scale + 0.407476; var Ci = (y - 256) / scale + 0.234204; var I = 0, R = 0, I2 = 0, R2 = 0; var n = 0; while ((R2+I2 < 2.0) && (n < 512)) { I = (R+R)*I+Ci; R = R2-I2+Cr; R2 = R*R; I2 = I*I; n++; } return n; }
mandelbrotïŒïŒã¯ããŒã«ã«å€æ°ã®ã¿ãå€æŽããŸãã ãã ãã sumsïŒïŒã¯ãã®ç¹ã§ããèå³æ·±ã-é¢æ°ã¯å ¥åé åXã®éšååãèšç®ããåºåé åsumã«æ ŒçŽããŸãã
function sums(x) { var sums = [], sum = 0; for (var i = 0; i < x.length; i++) { sum += x[i]; sums[i] = sum; } return sums; }
泚æãã¹ãããš-ãã®é¢æ°ã¯ãããŒã«ã«å€æ°ã ãã§ãªããããŒããªããžã§ã¯ããå€æŽããŠãå€ãåèšé åã«å²ãåœãŠãŸãã ãã ãããã®ãªããžã§ã¯ãã¯é¢æ°èªäœã§åŒ·èª¿è¡šç€ºãããŠãããããçŽç²ãªé¢æ°ã®ãŸãŸã§ãã å®éãç¹å®ã®äŸã¯ãRivertrailã®çŸåšã®ããŒãžã§ã³ã«ååšããå€ãã®å¶éã®ããã«äžŠè¡ããŠå®è¡ãããŸããããããŸãããã°ãããã¯ããã«å€æŽãããããšãé¡ã£ãŠããŸãã
ãŸãã Xãå€æŽããã XãããŒã«ã«ã«å²ãåœãŠãããªããããçŽç²ãšã¯èŠãªãããªãé¢æ°ã®äŸã次ã«ç€ºããŸãã
x = [1, 2, 3]; function impure() { x[0] += 1; }
䞊åå®è¡
ParallelArrayã®äž»ãªéæ³ã¯ãå¯èœãªéãæ©èœã䞊åã«å®è¡ããããšã§ãã ãã®å Žåã䞊ååŠçãŸãã¯å®è¡ã®ã·ãŒã±ã³ã¹ã¯ãJSèªäœã®å®è£ ã«äŸåããŸãã 䞊åå®è¡ãç®çãšããé¢æ°ã¯çŽç²ã§ãããšããäºå®ã¯ãæŠå¿µçã«ã¯åžžã«å®å šã«å®è¡ã§ããããšãæå³ããŸãã ããããããã¯JSãšã³ãžã³èªäœãããããå®è¡ã§ããããšãæå³ããŸãããJSãšã³ãžã³ã¯å€ãã®é ããæé©åãè¡ããŸããããããã®æé©åã®ãã¹ãŠãã¹ã¬ããã»ãŒãã§ã¯ãããŸããã
ãããŸã§ã®ãšããã䞊è¡ããŠå®è¡ãããæäœã®ãªã¹ãã¯ããªãæ§ããã§ãããæéãçµã€ã«ã€ããŠæ¡åŒµãããçæ³çã«ã¯æ¡åŒµãããçŽç²ãªæ©èœã䞊è¡ããŠå®è¡ã§ããããã«ãªããŸãã
ã³ãŒããé«éã§ããããšã確èªããã«ã¯ãå€ãã®ããšãè¡ãå¿ èŠããããŸãã 䞊åã³ãŒãå®è¡ãä¿èšŒããã«ã¯ãåãããšãããå¿ èŠããããŸãã ãããçç±ã§ãã
äŸ
ab = c
JITã³ã³ãã€ã©ãã¿ã€ãaãåæããããšãã°ãããããã£bãåžžã«ç¹å®ã®ãªãã»ããã§æ ŒçŽãããŠãããšå€æããå Žåãåäžã®ã¢ã»ã³ãã©ãŒåœä»€ã§ã³ãŒããæé©åã§ããŸãã ããããã³ã³ãã€ã©ãã³ãŒãã®è§£æã«å€±æãããšãææªã®å Žåãã€ã³ã¿ãŒããªã¿ãŒãåŒã³åºãããããŸããŸãªããã·ã¥ããŒãã«ããããã¿ã€ãã³ã°ããªãŒãªã©ã§äœæ¥ããŸãã ããã§ã ab = cãã¹ã¬ããã»ãŒããã©ãããç解ããå¿ èŠããããŸãã ããã§ã¯ãã¹ãŠãåçŽã§ããä¿ååœä»€ã¯ãä¿åå ã®ã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããã¹ã¬ããã1ã€ã ãã§ãããšããåæã®äžã§å®å šã§ãã æ©èœã®ãçŽåºŠãã®ä¿èšŒã§ãã ã€ã³ã¿ããªã¿ãæ°åè¡ã§ã¯ãªãã«ããŠãæ°çŸè¡ã®ã³ãŒãã«è§Šããå Žåãããã解決ããã®ã¯ããå°é£ã«ãªããŸãã
ãã¡ãããã©ã®ã³ãŒããå¹æçã«ã³ã³ãã€ã«ãããããç¥ãããšã¯åå©ã§ã¯ãããŸããã 次ã®èšäºã§ã¯ãä»æ¥ã®äžŠåå®è¡ãä¿èšŒããããã€ãã®ããšã«ã€ããŠèª¬æãããã®åéã§ã®å°æ¥ã®äºæž¬ãããã€ã瀺ããŸãã
䞊åå®è¡ã¢ãã«
Rivertrail Mozillã®äœ¿çšã¢ãã«ã¯ãIntelã®ãããã¿ã€ããšã¯è¥å¹²ç°ãªããŸãã ããã¯ãOpenCLã§JSãã³ã³ãã€ã«ãããã©ã°ã€ã³ã§ãã ãã€ãã£ãå®è£ ã§ã¯ã4ã€ã®ç°ãªãæ¹æ³ã§ã³ãŒããå®è¡ã§ããŸãããçŸæç¹ã§ã¯æåã®2ã€ããå©çšã§ããŸããã- é 次 ã ã¹ã¿ã³ãã€ã¢ãŒãã forã«ãŒãã®èšè¿°ãŸãã¯é«ã¬ãã«ã®é åã¡ãœããã®äœ¿çšãšåçã§ãã ãã®ã¢ãŒãã¯ããã€ããªãŒãã«ãã§åäœããå Žåã«ãã£ãŠã¯Auroraã§ãåäœããŸãã ã³ã³ãœãŒã«ã§var x = new ParallelArrayïŒ[1ã2ã3]ãšå ¥åããŠã¿ãŠãã ãã
- ãã«ãã³ã¢ã¢ãŒã ã ãã®ã¢ãŒãã§ã¯ãããã©ã«ãã§åäœããŸãã ãã«ãã³ã¢ã¢ãŒãã¯ãã·ã¹ãã å ã®ã³ã¢ããšã«1ã€ã®ã¹ã¬ãããé åžããŸãã åã¯ãŒã«ãŒã¹ã¬ããã¯ãé¢æ°ã®äžŠåã³ããŒã§åäœããŸãã ä»åŸæ°ãæã®ãã¡ã«ããã®ã¢ãŒãã®ããæ©èœçãªããŒãžã§ã³ãæåŸ ããŠããŸãã
- ãã¯ãã«åã¢ãŒãã ãã«ãã³ã¢ã®ããã«èŠããŸãããéãããããŸã-åã¯ãŒã«ãŒã¹ã¬ããã¯SSEåœä»€ã䜿çšããŠãäžåºŠã«è€æ°ã®é åèŠçŽ ãåŠçããŸãã ããã¯ããã«ãã³ã¢åŸã®èšç»ã«æ®ã£ãŠããŸãã
- GPU ããã¯ãã¯ãã«åã¢ãŒãã®å®è¡ã®åãªãå€åœ¢ã§ãããã³ãŒãã®ãã¯ãã«åã¯CPUã§ã¯ãªãGPUã§æ©èœããŸãã å€ãã®æè¡çãªéãããããŸãã äžæ¹ã§ã¯ããã¯ãã«åã¯ããŒããŠã§ã¢ã®GPUã«ãã£ãŠåŠçãããã³ã³ãã€ã©ã¯ç¹å¥ãªåœä»€ã䜿çšããå¿ èŠããããŸããã äžæ¹ãäžéšã®ãã©ãããã©ãŒã ã§ã¯ãCPUãšGPUéã§ã¡ã¢ãªãã³ããŒããããã«äžçæžåœåãå¿ èŠããããŸãã
説æãããŠããã¢ãŒãã®ãã¡ãæãäžè¬çãªãã®ã¯ã·ãªã¢ã«ãšèŠãªãããšãã§ããŸã-çŽç²ãªæ©èœã«é©çšã§ããŸãã ãã«ãã³ã¢ã¯éåžžã«çšéãåºããçŸåšãµããŒããããŠããæäœã«å¶éãããçŽç²ãªé¢æ°ãæäœãããšãã«äœ¿çšã§ããŸãã
ãã¯ãã«åãšGPUã¢ãŒãã¯ããã«å¶éãããŸãã GPUãããŒã¿ã®ç§»åãªã©ã«ç¹å®ã®å¶éã課ãäžæ¹ã§ãã³ãŒããããã¯ããã³ã¢ã³ããã¯ããã«SSEåœä»€ã«å€æã§ããé¢æ°ã«å¯ŸããŠã®ã¿ãã¯ãã«åã䜿çšããããšã¯çã«ããªã£ãŠããŸãã
ããã©ãŒãã³ã¹ã«ã€ããŠäžèš
ããã€ãã®ããŒã¿ãããã®ã§- ãããã¡ã€ãªã³ã°ã¯ãŸã å®äºããŠããŸãã
- ãŸã 詳现ãªãã¹ãã¯ãããŸãã
- èšç®ã®æé©åã倱æããŸãã
å°ãªããšããããã§ã¯Hypertheadingã䜿çšããŠã¯ã¢ããã³ã¢ã©ãããããã«èšå®ãããMandelbrotãèšç®ããçµæã瀺ããŸãã
seq-é 次ã¢ãŒãã®ã©ã³ã¿ã€ã
par-䞊åã¢ãŒãã§ã®åãæ°ã®ã¹ã¬ããã®ã©ã³ã¿ã€ã
ratio-ã·ãŒã±ã³ã·ã£ã«ã¢ãŒãã®æéãšãã©ã¬ã«ã®æéã®æ¯ïŒseq / parïŒã ããå€ãã®ãããè¯ãã
ã¹ã¬ãã | ã·ãŒã±ã³ã¹ïŒããªç§ïŒ | ããŒïŒããªç§ïŒ | æ¯çïŒSeq / ParïŒ |
1 | 2976 | 2515 | 1.18 |
2 | 2952 | 1782 | 1.65 |
4 | 2964 | 1417 | 2.09 |
8 | 2880 | 1149 | 2.50 |
16 | 2891 | 1109 | 2.60 |
ãšããã§ãã·ãªã¢ã«ã¢ãŒãã®ããŒã¿ã¯ããã©ã¬ã«ã¢ãŒãã®ParallelArrayã§ã¯ãªããã¢ã¬ã€ã«åºã¥ããJSå®è¡ã䜿çšããŠããã§ååŸãããã³ãŒãã¯ãJITã䜿çšãããããšã確èªããããã«ãã°ããæ©èœããŸããã JITã®äœ¿çšã«é¢ããæ©åšã®ãã§ãã¯ã¯è¡ãããŸããã§ããïŒãã®ããããé©åãªãããã¡ã€ãªã³ã°ã¯è¡ãããªãã£ãããšèšããŸãïŒã
PJã«ã€ããŠ
JavaScriptã䞊è¡ããŠå®è¡ããããã®ä»¥åã®ã¢ã€ãã¢ãèããããšããã人ããããããããŸãããããããã¯ãPJãïŒParallel Java ScriptïŒãšåŒã°ããŠããŸããã ããã¯ãã¹ãŠèšç»äžã§ãããPJ APIã§äžéšã®Rivertrailã¡ã«ããºã ã䜿çšããããšãå¯èœã§ãã ãããŠããããŸã§ã®ãšããããã®åé¡ã®é害ãšãªãçç±ã¯èŠãããŸããã çŸåšã®äž»ãªããšã¯ããã«ãã³ã¢ã¢ãŒãã§ãµããŒããããŠããé¢æ°ã»ãããæ¡åŒµããããšã§ããèŠçŽãã
ããŒã¿ã®çµåïŒäžŠè¡æ§ïŒã¯JSã«ããããããŸãïŒå°ãªããšãFirefoxã§ïŒã å®è£ ãããAPIã¯ã䞊è¡æ§ã䜿çšããŠJSãããã°ã©ãã³ã°èšèªã®æåç·ã«çœ®ãããšãã§ããŸãã ããã¯éåžžã«äœ¿ãããããã·ãªã¢ã«åãããå®è¡ãä¿èšŒããŸãã PJã¯æ±ºå®çãªå®è¡ãä¿èšŒããŸãããRivertrailã¯ïŒïŒreduceãªã©ã®é¢æ°ã®ããã«ä¿èšŒããŸããã ãããèªãèšèªã¯ã»ãšãã©ãããŸããã翻蚳ãšç·šéãæäŒã£ãŠãããvikky13ã«æè¬ããŸãã