泚é
ãã®èšäºã§ã¯ãSSSPã¢ã«ãŽãªãºã ãå¹ççã«äžŠååããæ¹æ³ãã€ãŸãã°ã©ãã£ãã¯ã¢ã¯ã»ã©ã¬ãŒã¿ã䜿çšããŠã°ã©ãå ã®æçãã¹ãèŠã€ããæ¹æ³ã説æããŸãã ã°ã©ãã£ãã¯ã¢ã¯ã»ã©ã¬ãŒã¿ãšããŠã ã±ãã©ãŒã¢ãŒããã¯ãã£ã®GTX Titanã«ãŒããæ€èšãããŸãã
ã¯ããã«
æè¿ãã°ã©ãã£ãã¯ã¢ã¯ã»ã©ã¬ãŒã¿ïŒGPUïŒã¯ãéã°ã©ãã£ãã¯ã³ã³ãã¥ãŒãã£ã³ã°ã§ãŸããŸãéèŠãªåœ¹å²ãæãããŠããŸãã ãããã®äœ¿çšã®å¿ èŠæ§ã¯ããããã®æ¯èŒçé«ãçç£æ§ãšäœã³ã¹ãã«ãããã®ã§ãã ãåãã®ããã«ãGPUã§ã¯ãæ§é ã°ãªããã®åé¡ã¯ååã«è§£æ±ºãããŠããã䞊ååŠçã¯ç°¡åã«åºå¥ã§ããŸãã ãã ãã倧容éãå¿ èŠãšããéæ§é ã°ãªããã䜿çšããã¿ã¹ã¯ããããŸãã ãã®ãããªåé¡ã®äŸã¯ãåäžã®æçãœãŒã¹ãã¹åé¡ïŒSSSPïŒã§ããããã¯ãéã¿ä»ãã°ã©ãå ã®ç¹å®ã®é ç¹ããä»ã®ãã¹ãŠã®é ç¹ãŸã§ã®æçãã¹ãèŠã€ããã¿ã¹ã¯ã§ãã CPUã§ãã®åé¡ã解決ããã«ã¯ãå°ãªããšã2ã€ã®æåãªã¢ã«ãŽãªãºã ãDeystraã¢ã«ãŽãªãºã ãšFord-Bellmanã¢ã«ãŽãªãºã ããããŸãã GPUã«ã¯ãDeystraã¢ã«ãŽãªãºã ãšFord-Bellmanã¢ã«ãŽãªãºã ã®äžŠåå®è£ ããããŸãã ãã®åé¡ã®è§£æ±ºçã説æããäž»ãªèšäºã¯æ¬¡ã®ãšããã§ãã
- CUDAãPawan HarishãPJ Narayananã䜿çšããGPUã§ã®å€§èŠæš¡ãªã°ã©ãã¢ã«ãŽãªãºã ã®é«éå
- æççµè·¯åé¡ãžã®æ°ããGPUããŒã¹ã®ã¢ãããŒããHector Ortega-ArranzãYuri TorresãDiego R. Llanosãããã³Arturo Gonzalez-Escribano
ä»ã«ãè±èªã®èšäºããããŸãã ãããããããã®èšäºã¯ãã¹ãŠåãã¢ãããŒããã€ãŸãDeystraã¢ã«ãŽãªãºã ã®ã¢ã€ãã¢ã䜿çšããŠããŸãã Ford-Bellmanã¢ã«ãŽãªãºã ã®ã¢ã€ãã¢ãšã±ãã©ãŒã¢ãŒããã¯ãã£ã®å©ç¹ã䜿çšããŠåé¡ã解決ããæ¹æ³ã説æããŸãã GPUã®ã¢ãŒããã¯ãã£ãšèšåãããã¢ã«ãŽãªãºã ã«ã€ããŠã¯ãã§ã«å€ãã®ããšãæžãããŠããã®ã§ããã®èšäºã§ã¯ããã«ã€ããŠã¯ãã以äžæžããŸããã ãŸããã¯ãŒãïŒã¯ãŒãïŒããã¥ãŒããããã¯ãSMXãããã³CUDAã«é¢é£ãããã®ä»ã®åºæ¬çãªäºé ã®æŠå¿µã¯èªè ã«ãªãã¿ããããšèããããŠããŸãã
ããŒã¿æ§é ã®èª¬æ
å°æ¥çã«èšåãããå€æããããããç¡åå éã°ã©ãã®ã¹ãã¬ãŒãžæ§é ãç°¡åã«æ€èšããŸãã ã°ã©ãã¯ãå§çž®ãããCSR圢åŒã§æå®ãããŸãã ãã®åœ¢åŒã¯ãçè¡åãšã°ã©ãã®ä¿åã«åºã䜿çšãããŠããŸãã Nåã®é ç¹ãšMåã®ãšããžãæã€ã°ã©ãã®å Žåãxadjãadjncyãweightsã®3ã€ã®é åãå¿ èŠã§ãã xadjé åã®ãµã€ãºã¯N + 1ã§ãä»ã®2ã€ã¯2 * Mã§ããããã¯ãé ç¹ã®ä»»æã®ãã¢ã®ç¡æåã°ã©ãã§ã¯ãçŽæ¥ã¢ãŒã¯ãšéã¢ãŒã¯ãæ ŒçŽããå¿ èŠãããããã§ãã
ã°ã©ããä¿åããåçã¯æ¬¡ã®ãšããã§ãã é ç¹Iã®è¿åã®ãªã¹ãå šäœã¯ãã€ã³ããã¯ã¹xadj [I]ããxadj [I + 1]ãŸã§ã®adjncyé åã«ããããããå«ã¿ãŸããã åæ§ã®ã€ã³ããã¯ã¹ã¯ãé ç¹Iããã®åãšããžã®éã¿ãæ ŒçŽããŸãã説æã®ããã«ãå·ŠåŽã®å³ã¯é£æ¥è¡åã䜿çšããŠèšè¿°ããã5ã€ã®é ç¹ã®ã°ã©ãã瀺ããå³åŽã¯CSR圢åŒã瀺ããŸãã
ã¢ã«ãŽãªãºã ã®GPUå®è£
å ¥åæºå
1ã€ã®ã¹ããªãŒãã³ã°ãã«ãããã»ããµïŒSMXïŒã®èšç®è² è·ãå¢ããã«ã¯ãå ¥åããŒã¿ãå€æããå¿ èŠããããŸãã ãã¹ãŠã®å€æã¯ã2ã€ã®æ®µéã«åããããšãã§ããŸãã
- CSRãã©ãŒãããã調æŽããŠãã©ãŒãããã調æŽããïŒCOOïŒ
- COO圢åŒã®äžŠã¹æ¿ã
æåã®æ®µéã§ã¯ãCSR圢åŒã次ã®ããã«æ¡åŒµããå¿ èŠããããŸããã¢ãŒã¯ã®å§ãŸããæ ŒçŽããå¥ã®startVé åãå°å ¥ããŸãã 次ã«ãadjncyé åã«ãã®äž¡ç«¯ãæ ŒçŽãããŸãã ãããã£ãŠãè¿åãä¿åãã代ããã«ãã¢ãŒã¯ãä¿åããŸãã äžèšã®ã°ã©ãäžã®ãã®å€æã®äŸïŒ
2çªç®ã®æ®µéã§ã¯ãåãã¢ïŒUãVïŒã1åã ãçºçããããã«ãååŸãããšããžããœãŒãããå¿ èŠããããŸãã ãããã£ãŠããšããžïŒUãVïŒãåŠçããå ŽåãGPUã®ã°ããŒãã«ã¡ã¢ãªãããã®ãšããžã«é¢ããããŒã¿ãåèªã¿èŸŒã¿ããå¿ èŠãªãããšããžïŒVãUïŒãããã«åŠçã§ããŸãã
ã³ã¢ã³ã³ãã¥ãŒãã£ã³ã°ã³ã¢
GPUã§ã®å®è£ ã®åºç€ã¯ã Ford-Bellmanã¢ã«ãŽãªãºã ã§ãã ãã®ã¢ã«ãŽãªãºã ã¯ãrib骚ãäºãã«ç¬ç«ããŠè¡šç€ºã§ããrib骚ã®ããŒã¿ãšãã®éã¿ãäžåã«äžŠãã§ãããããGPUã¡ã¢ãªã®åž¯åå¹ ãåäžãããããGPUã§ã®å®è£ ã«é©ããŠããŸããint k = blockIdx.x * blockDim.x + threadIdx.x; if(k < maxV) { double w = weights[k]; unsigned en = endV[k]; unsigned st = startV[k]; if(dist[st] > dist[en] + w) // (*) { dist[st] = dist[en] + w; modif[0] = iter; } else if(dist[en] > dist[st] + w) // (**) { dist[en] = dist[st] + w; modif[0] = iter; } }
ãã®ã«ãŒãã«ã§ã¯ãåã¹ã¬ããã2ã€ã®ãšããžïŒé æ¹åãšéæ¹åïŒãåŠçãããããã®1ã€ã«æ²¿ã£ãè·é¢ãæ¹åããããšããŸãã ifãããã¯ã®äž¡æ¹ã®æ¡ä»¶ãåæã«æºããããšãã§ããªãããšã¯æããã§ãã åãšããžãé çªã«ã¹ãã£ã³ãããFord-Bellmanã¢ã«ãŽãªãºã ãšã¯ç°ãªããGPUã§å®è£ ãããã¢ã«ãŽãªãºã ã§ã¯ã2ã€ä»¥äžã®ãããŒãåãdist [I]ã»ã«ãæŽæ°ãããšãã«ãããŒã®ã競åãã®ç¶æ³ãçºçããå ŽåããããŸãã ãã®å Žåãã¢ã«ãŽãªãºã ã¯æ£ãããŸãŸã§ããããšã瀺ããŸãã
cell dist [I]ãæŽæ°ãã2ã€ã®ã¹ã¬ããK1ããã³K2ããããšããŸãã ããã¯ãæ¡ä»¶ïŒ*ïŒãŸãã¯ïŒ**ïŒãæºããããããšãæå³ããŸãã 2ã€ã®ã±ãŒã¹ãèããããŸãã æå-2ã€ã®ã¹ã¬ããã®ãã¡ã®1ã€ãæå°å€ãèšé²ããŸããã 次ã«ãããã2ã€ã®ã¹ã¬ããã®æ¬¡ã®å埩ã§æ¡ä»¶ã¯falseã«ãªããã»ã«dist [I]ã®å€ã¯æå°ã«ãªããŸãã 2çªç®-èšé²ããã2ã€ã®ã¹ã¬ããã®1ã€ã¯æå°å€ã§ã¯ãããŸããã ãã®åŸã次ã®å埩ã§ãæ¡ä»¶ã¯ã¹ã¬ããã®1ã€ã«å¯ŸããŠtrueãä»ã®ã¹ã¬ããã«å¯ŸããŠfalseã«ãªããŸãã ãããã£ãŠãçµæã¯äž¡æ¹ã®ã±ãŒã¹ã§åãã«ãªããŸãããç°ãªãå埩åæ°ã§éæãããŸãã
Ford-Bellmanã¢ã«ãŽãªãºã ã®æé©åãããããŒãžã§ã³ã«ããã°ãå埩ã§disté åã«å€æŽããªãã£ãå Žåããã以äžã®å埩ã¯æå³ããããŸããã modifå€æ°ã¯ãããã®ç®çã®ããã«GPUã«å°å ¥ãããã¹ã¬ããã¯çŸåšã®å埩ã®æ°ãæžã蟌ã¿ãŸããã
1åã®å埩-1åã®ã«ãŒãã«èµ·åã åºæ¬ããŒãžã§ã³ã§ã¯ãCPUã§ã«ãŒãã§ã«ãŒãã«ãéå§ããmodifå€æ°ãèªã¿åããŸããååã®å埩ããå€æŽãããŠããªãå Žåãdisté åã§ã¯ãåé¡ã«å¯Ÿããçãã¯ãæå®ãããé ç¹ããä»ã®ãã¹ãŠã®é ç¹ãžã®æçãã¹ã§ãã
å®è£ ãããã¢ã«ãŽãªãºã ã®æé©å
次ã«ãã¢ã«ãŽãªãºã ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«æ¹åã§ããæé©åãæ€èšããŸãã æçµçãªã¢ãŒããã¯ãã£ã®ç¥èã¯ãæé©åã®å®è¡ã«åœ¹ç«ã¡ãŸãã
ææ°ã®CPUã«ã¯3ã¬ãã«ã®ãã£ãã·ã¥ããããŸãã äžæ¬¡ãã£ãã·ã¥ã®ãµã€ãºã¯64Kã§ããã¹ãŠã®ããã»ããµã³ã¢ã«å«ãŸããŠããŸãã 2次ãã£ãã·ã¥ã®ãµã€ãºã¯1ã2MBã§ãã 第3ã¬ãã«ã®ãã£ãã·ã¥ã¯CPUå šäœã«å ±éã§ããããµã€ãºã¯12ã15MBçšåºŠã§ãã
ææ°ã®GPUã«ã¯2ã¬ãã«ã®ãã£ãã·ã¥ããããŸãã äžæ¬¡ãã£ãã·ã¥ã®ãµã€ãºã¯64KBã§ãã å ±æã¡ã¢ãªãšã¬ãžã¹ã¿ã®æ··éã«äœ¿çšãããŸãã å ±æã¡ã¢ãªã«äœ¿çšã§ããã®ã¯48KB以äžã§ãã åã³ã³ãã¥ãŒãã£ã³ã°ãŠãããã«å«ãŸããŠããŸãã 2次ãã£ãã·ã¥ã®æ倧ãµã€ãºã¯1.5 MBã§ãGPUå šäœã«å ±éã§ãã GPUã®ã°ããŒãã«ã¡ã¢ãªããããŠã³ããŒããããããŒã¿ããã£ãã·ã¥ããããã«äœ¿çšãããŸãã ææ°ã®GPU GK110ãããã«ã¯15ã®åŠçãŠãããããããŸãã çŽ48KBã®ç¬¬1ã¬ãã«ãã£ãã·ã¥ãš102KBã®ç¬¬2ã¬ãã«ãã£ãã·ã¥ã1ã€ã®ãããã¯ã«åãŸãããšãããããŸãã CPUãšæ¯èŒãããšãããã¯éåžžã«å°ãããããGPUã®ã°ããŒãã«ã¡ã¢ãªããã®èªã¿åãæäœã¯ãäžå€®åŠçè£ çœ®ã®ã¡ã€ã³ã¡ã¢ãªããã®èªã¿åãæäœãããé«äŸ¡ã§ãã ãŸããKeplerã¢ãŒããã¯ãã£ã«ã¯ãèªã¿åãå°çšã®ãã¯ã¹ãã£ãã£ãã·ã¥ã«çŽæ¥ã¢ã¯ã»ã¹ããæ©èœããããŸãã ãããè¡ãã«ã¯ãã«ãŒãã«ã®å¯Ÿå¿ããä»®ãã©ã¡ãŒã¿ã®åã«const __restrictãè¿œå ããŸãã
ãã¯ã¹ãã£ãã£ãã·ã¥ã䜿çšãã
ãã®ã¿ã¹ã¯ã§ã¯ãè·é¢ã®disté åãåžžã«æŽæ°ããŠèªã¿åãå¿ èŠããããŸãã ãã®é åã¯ãã¢ãŒã¯ãšãã®éã¿ã«é¢ããæ å ±ãšæ¯èŒããŠãGPUã®ã°ããŒãã«ã¡ã¢ãªã§ããªãã®ã¹ããŒã¹ãå æããŸãã ããšãã°ãé ç¹æ°ã2 20 ïŒçŽ100äžïŒã®ã°ã©ãã®å Žåãdisté åã¯8 MBãå æããŸãã ããã«ããããããããã®é åãžã®ã¢ã¯ã»ã¹ã¯ã©ã³ãã ã«å®è¡ãããŸããããã¯ãã°ããŒãã«ã¡ã¢ãªããåã³ã³ãã¥ãŒãã£ã³ã°ã¯ãŒããžã®è¿œå ã®ããŠã³ããŒããçæããããããGPUã«ãšã£ãŠã¯äžé©åã§ãã ã¯ãŒãããšã®ããŠã³ããŒãæ°ãæå°éã«æããããã«ãL2ãã£ãã·ã¥ã«ããŒã¿ãä¿åããèªã¿åããŸãããä»ã®ã¯ãŒãããŒã¿ã§ã¯äœ¿çšããŸããããã¯ã¹ãã£ãã£ãã·ã¥ã¯èªã¿åãå°çšã§ãããããããã䜿çšããã«ã¯ãdistè·é¢ã®åãé åã«2ã€ã®ç°ãªããªã³ã¯ãå ¥åããå¿ èŠããããŸããã é¢é£ã³ãŒãïŒ
__global__ void relax_ker (const double * __restrict dist, double *dist1, ⊠âŠ) { int k = blockIdx.x * blockDim.x + threadIdx.x + minV; if(k < maxV) { double w = weights[k]; unsigned en = endV[k]; unsigned st = startV[k]; if(dist[st] > dist[en] + w) { dist1[st] = dist[en] + w; modif[0] = iter; } else if(dist[en] > dist[st] + w) { dist1[en] = dist[st] + w; modif[0] = iter; } } }
ãã®çµæãã«ãŒãã«å ã§ã¯ãã¹ãŠã®èªã¿åãæäœã1ã€ã®ã¢ã¬ã€ã§å®è¡ããããã¹ãŠã®æžã蟌ã¿æäœãå¥ã®ã¢ã¬ã€ã§å®è¡ãããããšãå€æããŸããã ãã ããdistãšdist1ã®äž¡æ¹ã®ãªã³ã¯ã¯ãåãGPUã¡ã¢ãªã®å ŽæãæããŸãã
ãã£ãã·ã¥äœ¿çšçãåäžãããããŒã¿ã®ããŒã«ã©ã€ãº
äžèšã®æé©åã®æé«ã®ããã©ãŒãã³ã¹ãåŸãã«ã¯ãããŠã³ããŒããããããŒã¿ãå¯èœãªéãL2ãã£ãã·ã¥ã«ããããšãå¿ èŠã§ãã disté åã¯ãendVããã³startVé åã«æ ŒçŽãããŠããäºåå®çŸ©ãããã€ã³ããã¯ã¹ã䜿çšããŠã¢ã¯ã»ã¹ãããŸãã åŒã³åºããããŒã«ã©ã€ãºããããã«ãdisté åãç¹å®ã®é·ãã®ã»ã°ã¡ã³ãïŒPèŠçŽ ãªã©ïŒã«åå²ããŸãã ã°ã©ãã«ã¯Nåã®é ç¹ããããããïŒN / P + 1ïŒåã®ç°ãªãã»ã°ã¡ã³ããååŸããŸãã 次ã«ã次ã®ããã«ãšããžããããã®ã»ã°ã¡ã³ãã«ãœãŒãããŸãã æåã®ã°ã«ãŒãã§ã¯ã端ããŒãã»ã°ã¡ã³ãã«å«ãŸãããšããžãšãæåã«ãŒãã®ãšããžã次ã«æåã®ã»ã°ã¡ã³ããªã©ã®ãšããžãå²ãåœãŠãŸãã 2çªç®ã®ã°ã«ãŒãã§ã¯ã端ãæåã®ã»ã°ã¡ã³ãã«å±ãã端ãæåã«ãŒãã«ã次ã«æåã«ããªã©ã®ãšããžãå²ãåœãŠãŸãããã®ãšããžã®çœ®æåŸãæåã®ã°ã«ãŒãã®ã¹ã¬ãããçµäºé ç¹ãšãŒããæåãªã©ã®ãŒãã»ã°ã¡ã³ãããããŒã¿ãèŠæ±ããéããããšãã°æåã®ã°ã«ãŒãã«å¯Ÿå¿ããdisté åã®èŠçŽ ã®å€ã¯ãã£ãã·ã¥å ã«ãããŸãã éå§é ç¹ã®ããã ããã«ãã¹ã¬ããã3ã€ä»¥äžã®ç°ãªãã»ã°ã¡ã³ãããããŒã¿ãèŠæ±ããããã«ããšããžãé 眮ãããŸãã
ã¢ã«ãŽãªãºã ã®ãã¹ãçµæ
ãã¹ãã«ã¯ãéæåæ§ã®åæRMATã°ã©ãã䜿çšããŸãã ãããã¯ããœãŒã·ã£ã«ãããã¯ãŒã¯ãšã€ã³ã¿ãŒãããããã®å®éã®ã°ã©ããããŸãã¢ãã«åãããã®ã§ãã ã°ã©ãã®å¹³åæ¥ç¶æ§ã¯32ã§ãé ç¹ã®æ°ã¯2ã®çŽ¯ä¹ã§ãã 次ã®è¡šã«ããã¹ããããã°ã©ãã瀺ããŸããé ç¹ã®æ°2 ^ N | é ç¹ã®æ° | ã¢ãŒã¯ã®æ° | disté åã®ãµã€ãºïŒMBïŒ | rib骚ã®é åã®ãµã€ãºãšééïŒMBïŒ |
14 | 16 384 | 524,288 | 0.125 | 4 |
15 | 32,768 | 1,048,576 | 0.250 | 8 |
16 | 65,536 | 2,097 152 | 0,500 | 16 |
17 | 131 072 | 4 194 304 | 1 | 32 |
18 | 262 144 | 8 388 608 | 2 | 64 |
19 | 524,288 | 16 777 216 | 4 | 128 |
20 | 1,048,576 | 33554432 | 8 | 256 |
21 | 2,097 152 | 67108864 | 16 | 512 |
22 | 4 194 304 | 134 217 728 | 32 | 1024 |
23 | 8 388 608 | 268 435 456 | 64 | 2048 |
24 | 16 777 216 | 536 870 912 | 128 | 4096 |
è¡šãããé ç¹æ°ã2 18以äžã®ã°ã©ãã®è·é¢é ådistã¯ãGPUã®L2ãã£ãã·ã¥ã«å®å šã«ã¯åãŸããªãããšãããããŸãã ãã¹ãã¯ã192åïŒåèš2688åïŒã®cudaã³ã¢ãåãã14åã®SMXãšãåšæ³¢æ°3.4GHzããã³8MBãã£ãã·ã¥ãåãã第3äžä»£Intelã³ã¢i7ããã»ããµãŒãåããNividia GTX Titan GPUã§å®è¡ãããŸããã CPUã®ããã©ãŒãã³ã¹ãæ¯èŒããããã«ãæé©åããããã€ã¯ã¹ãã©ã¢ã«ãŽãªãºã ã䜿çšãããŸããã CPUã§äœæ¥ããåã®ããŒã¿çœ®æã®åœ¢ã§ã®æé©åã¯è¡ãããŸããã§ããã æéã§ã¯ãªããããã©ãŒãã³ã¹ã€ã³ãžã±ãŒã¿ã¯ã1ç§ãããã«åŠçãããã¢ãŒã¯ã®æ°ã§ãã ãã®å ŽåãååŸããæéãã°ã©ãå ã®ã¢ãŒã¯ã®æ°ã§å²ãå¿ èŠããããŸãã æçµçµæãšããŠãå¹³å32ãã€ã³ããååŸãããŸããã æ倧å€ãšæå°å€ãèšç®ãããŸããã
ã³ã³ãã€ã«ã«ã¯ã13çªç®ã®ããŒãžã§ã³ã®Intelã³ã³ãã€ã©ãšããã©ã°âO3 âarch = sm_35ã䜿çšããNVCC CUDA 5.5ã䜿çšãããŸããã
å®äºããäœæ¥ã®çµæãšããŠã次ã®ã°ã©ããæ€èšããŠãã ããã
ãã®ã°ã©ãã¯ã次ã®ã¢ã«ãŽãªãºã ã®å¹³åããã©ãŒãã³ã¹æ²ç·ã瀺ããŠããŸãã
- ãã£ãã·ã¥&&å¶é-ãã¹ãŠã®æé©åãåããGPUã¢ã«ãŽãªãºã
- ãã£ãã·ã¥ãªã-ãã£ãã·ã¥ãæ¹åããããã«é åãæé©åããªãGPUã¢ã«ãŽãªãºã
- å¶é-ãã¯ã¹ãã£ãã£ãã·ã¥ã®æé©åãªãã®GPUã¢ã«ãŽãªãºã
- ãã£ãã·ã¥&&å¶éãªã-æé©åãªãã®åºæ¬çãªGPUã¢ã«ãŽãªãºã
- CPU-CPUã®åºæ¬ã¢ã«ãŽãªãºã
äž¡æ¹ã®æé©åãããã©ãŒãã³ã¹ã«å€§ãã圱é¿ããããšãããããŸãã const __restrictæé©åã誀çšãããšããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ãããããšã«æ³šæããŠãã ããã çµæã®å é床ã¯ãã®ã°ã©ãã§èŠãããšãã§ããŸãïŒ
ãã®ã°ã©ãã¯ãCPUãšã¯ç°ãªããGPUã®å¹³åããã®åå·®ã®ç¯å²ãåºãããšã瀺ããŠããŸãã ããã¯ããããŒã®ãã¬ãŒã¹ãã®åœ¢åŒã§ã®ã¢ã«ãŽãªãºã å®è£ ã®ç¹æ§ã«ãããã®ã§ãããªããªããæåããæåãŸã§ãç°ãªãå埩åæ°ãååŸã§ããããã§ãã
ãããã«
è¡ãããäœæ¥ã®çµæãSSSPã¢ã«ãŽãªãºã ãéçºãå®è£ ãããã³æé©åãããŸãã-ã°ã©ãå ã®æçãã¹ã®æ€çŽ¢ã ãã®ã¢ã«ãŽãªãºã ã¯ãç¹å®ã®é ç¹ããä»ã®ãã¹ãŠã®é ç¹ãŸã§ã®ã°ã©ãå ã®æçè·é¢ãæ€çŽ¢ããŸãã GTX Titanã¡ã¢ãªã«åãŸããã¹ãŠã®ã°ã©ãã®äžã§ãæ倧ããã©ãŒãã³ã¹ã¯ãé ç¹æ°ãæ倧21ã®ã°ã©ãã§ç€ºãããŠããŸã-1ç§ãããçŽ1åã®ãšããžã éæãããæ倧平åå é床ã¯ãé ç¹ã®æ°ã100äžãã400äžã®ã°ã©ãã§çŽ40ã§ããã