ç¶¿å¯ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã®ãã¥ãŒãã³ã°ãéããŠãWebGLã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ããã³ã·ã£ã«ãæå€§éã«åŒãåºããŸããããã©ãŒãã³ã¹ãæé©åãããªãœãŒã¹äœ¿çšçãåäžãããèŠæ±ã®å³ããã¿ã¹ã¯ã§ããé«éãªåŠçé床ãå®çŸããŸãã
WebGLã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ãã£ã¹ãããæé©åïŒã¯ãŒã¯ã°ã«ãŒããµã€ãºã®ãã¥ãŒãã³ã°
WebGLã®åŒ·åãªæ©èœã§ããã³ã³ãã¥ãŒãã·ã§ãŒããŒã¯ãéçºè ãWebãã©ãŠã¶å ã§çŽæ¥ãæ±çšèšç®ïŒGPGPUïŒã®ããã«GPUã®æã€å€§èŠæš¡ãªäžŠåæ§ã掻çšããããšãå¯èœã«ããŸããããã«ãããç»ååŠçãç©çã·ãã¥ã¬ãŒã·ã§ã³ããããŒã¿åæãæ©æ¢°åŠç¿ãŸã§ãå¹ åºãã¿ã¹ã¯ãé«éåããæ©äŒãéãããŸããããããã³ã³ãã¥ãŒãã·ã§ãŒããŒã§æé©ãªããã©ãŒãã³ã¹ãéæããã«ã¯ãèšç®ãGPUäžã§ã©ã®ããã«åå²ããå®è¡ãããããæ±ºå®ããéèŠãªãã©ã¡ãŒã¿ã§ããã¯ãŒã¯ã°ã«ãŒããµã€ãºãçè§£ããæ éã«ãã¥ãŒãã³ã°ããããšãéèŠã§ãã
ã³ã³ãã¥ãŒãã·ã§ãŒããŒãšã¯ãŒã¯ã°ã«ãŒãã®çè§£
æé©åæè¡ã«é£ã³èŸŒãåã«ããŸãã¯åºæ¬ãæç¢ºã«çè§£ããŸãããïŒ
- ã³ã³ãã¥ãŒãã·ã§ãŒããŒïŒãããã¯GLSLïŒOpenGL Shading LanguageïŒã§æžãããGPUäžã§çŽæ¥å®è¡ãããããã°ã©ã ã§ããåŸæ¥ã®é ç¹ã·ã§ãŒããŒããã©ã°ã¡ã³ãã·ã§ãŒããŒãšã¯ç°ãªããã³ã³ãã¥ãŒãã·ã§ãŒããŒã¯ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã«çžããããä»»æã®èšç®ãå®è¡ã§ããŸãã
- ãã£ã¹ãããïŒã³ã³ãã¥ãŒãã·ã§ãŒããŒãèµ·åããè¡çºã¯ãã£ã¹ããããšåŒã°ããŸãã
gl.dispatchCompute(x, y, z)颿°ã¯ãã·ã§ãŒããŒãå®è¡ããã¯ãŒã¯ã°ã«ãŒãã®ç·æ°ãæå®ããŸããããã3ã€ã®åŒæ°ã¯ããã£ã¹ãããã°ãªããã®æ¬¡å ãå®çŸ©ããŸãã - ã¯ãŒã¯ã°ã«ãŒãïŒã¯ãŒã¯ã°ã«ãŒãã¯ãGPUå ã®åäžã®åŠçãŠãããã§åæã«å®è¡ãããã¯ãŒã¯ã¢ã€ãã ïŒã¹ã¬ãããšãåŒã°ããïŒã®éãŸãã§ããã¯ãŒã¯ã°ã«ãŒãã¯ãã°ã«ãŒãå ã§ããŒã¿ãå ±æããæäœãåæããããã®ã¡ã«ããºã ãæäŸããŸãã
- ã¯ãŒã¯ã¢ã€ãã ïŒã¯ãŒã¯ã°ã«ãŒãå
ã§ã®ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®åäžã®å®è¡ã€ã³ã¹ã¿ã³ã¹ã§ããåã¯ãŒã¯ã¢ã€ãã ã¯ãçµã¿èŸŒã¿ã®GLSL倿°
gl_LocalInvocationIDãä»ããŠã¢ã¯ã»ã¹å¯èœãªãã¯ãŒã¯ã°ã«ãŒãå ã§äžæã®IDãæã¡ãŸãã - ã°ããŒãã«å®è¡IDïŒãã£ã¹ãããå
šäœã§ã®åã¯ãŒã¯ã¢ã€ãã ã®äžæãªèå¥åã§ããããã¯
gl_GlobalInvocationIDïŒå šäœIDïŒãšgl_LocalInvocationIDïŒã¯ãŒã¯ã°ã«ãŒãå IDïŒã®çµã¿åããã§ãã
ãããã®æŠå¿µéã®é¢ä¿ã¯æ¬¡ã®ããã«èŠçŽã§ããŸãïŒãã£ã¹ãããã¯ã¯ãŒã¯ã°ã«ãŒãã®ã°ãªãããèµ·åããåã¯ãŒã¯ã°ã«ãŒãã¯è€æ°ã®ã¯ãŒã¯ã¢ã€ãã ã§æ§æãããŸããã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ã³ãŒãã¯åã¯ãŒã¯ã¢ã€ãã ã«ãã£ãŠå®è¡ãããæäœãå®çŸ©ããGPUã¯ãããã®æäœã䞊åã«å®è¡ããŠããã®è€æ°ã®åŠçã³ã¢ã®èœåãæŽ»çšããŸãã
äŸïŒã³ã³ãã¥ãŒãã·ã§ãŒããŒã䜿çšããŠãã£ã«ã¿ãŒãé©çšããããã«å€§ããªç»åãåŠçããŠãããšæ³åããŠãã ãããç»åãã¿ã€ã«ã«åå²ããåã¿ã€ã«ãã¯ãŒã¯ã°ã«ãŒãã«å¯Ÿå¿ããããã«ãããããããŸãããåã¯ãŒã¯ã°ã«ãŒãå
ã§ã¯ãåã
ã®ã¯ãŒã¯ã¢ã€ãã ãã¿ã€ã«å
ã®åã
ã®ãã¯ã»ã«ãåŠçã§ããŸãããã®å Žåãgl_LocalInvocationIDã¯ã¿ã€ã«å
ã®ãã¯ã»ã«ã®äœçœ®ã衚ãããã£ã¹ããããµã€ãºã¯åŠçãããã¿ã€ã«ã®æ°ïŒã¯ãŒã¯ã°ã«ãŒãã®æ°ïŒã決å®ããŸãã
ã¯ãŒã¯ã°ã«ãŒããµã€ãºãã¥ãŒãã³ã°ã®éèŠæ§
ã¯ãŒã¯ã°ã«ãŒããµã€ãºã®éžæã¯ãã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããŸããäžé©åã«èšå®ãããã¯ãŒã¯ã°ã«ãŒããµã€ãºã¯ã以äžã®ãããªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãïŒ
- GPU䜿çšçã®éæé©åïŒã¯ãŒã¯ã°ã«ãŒããµã€ãºãå°ãããããšãGPUã®åŠçãŠããããååã«æŽ»çšããããå šäœçãªããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
- ãªãŒããŒãããã®å¢å ïŒæ¥µç«¯ã«å€§ããªã¯ãŒã¯ã°ã«ãŒãã¯ããªãœãŒã¹ç«¶åã®å¢å ãåæã³ã¹ãã«ãããªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸãã
- ã¡ã¢ãªã¢ã¯ã»ã¹ã®ããã«ããã¯ïŒã¯ãŒã¯ã°ã«ãŒãå ã®éå¹çãªã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ã®ããã«ããã¯ãåŒãèµ·ãããèšç®ãé ãããå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ã®ã°ãã€ãïŒã¯ãŒã¯ã°ã«ãŒããµã€ãºãæ éã«éžæãããŠããªãå Žåãç°ãªãGPUããã©ã€ããŒéã§ããã©ãŒãã³ã¹ã倧ããç°ãªãããšããããŸãã
ãããã£ãŠãæé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºãèŠã€ããããšã¯ãWebGLã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ããã©ãŒãã³ã¹ãæå€§åããããã«äžå¯æ¬ ã§ãããã®æé©ãªãµã€ãºã¯ããŒããŠã§ã¢ãšã¯ãŒã¯ããŒãã«äŸåãããããå®éšãå¿ èŠã§ãã
ã¯ãŒã¯ã°ã«ãŒããµã€ãºã«åœ±é¿ãäžããèŠå
ç¹å®ã®ã³ã³ãã¥ãŒãã·ã§ãŒããŒã«ãšã£ãŠæé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã«åœ±é¿ãäžããããã€ãã®èŠå ããããŸãïŒ
- GPUã¢ãŒããã¯ãã£ïŒç°ãªãGPUã¯ãåŠçãŠãããã®æ°ãã¡ã¢ãªåž¯åå¹ ããã£ãã·ã¥ãµã€ãºãªã©ãç°ãªãã¢ãŒããã¯ãã£ãæã£ãŠããŸããæé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã¯ãGPUãã³ããŒïŒäŸïŒAMDãNVIDIAãIntelïŒãã¢ãã«ã«ãã£ãŠç°ãªãããšããããããŸãã
- ã·ã§ãŒããŒã®è€éãïŒã³ã³ãã¥ãŒãã·ã§ãŒããŒã³ãŒãèªäœã®è€éãããæé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã«åœ±é¿ãäžããå¯èœæ§ããããŸããããè€éãªã·ã§ãŒããŒã¯ãã¡ã¢ãªã¬ã€ãã³ã·ãé èœããããã«ãã倧ããªã¯ãŒã¯ã°ã«ãŒãããæ©æµãåããå¯èœæ§ããããŸãã
- ã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ïŒã³ã³ãã¥ãŒãã·ã§ãŒããŒãã¡ã¢ãªã«ã¢ã¯ã»ã¹ããæ¹æ³ã¯ãéèŠãªåœ¹å²ãæãããŸããã³ã¢ã¬ã¹ïŒcoalescedïŒã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ïŒã¯ãŒã¯ã°ã«ãŒãå ã®ã¯ãŒã¯ã¢ã€ãã ãé£ç¶ããã¡ã¢ãªäœçœ®ã«ã¢ã¯ã»ã¹ããïŒã¯ãäžè¬çã«ããã©ãŒãã³ã¹ãåäžãããŸãã
- ããŒã¿äŸåæ§ïŒã¯ãŒã¯ã°ã«ãŒãå ã®ã¯ãŒã¯ã¢ã€ãã ãããŒã¿ãå ±æããããæäœãåæãããããå¿ èŠãããå Žåãããã¯æé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã«åœ±é¿ãäžãããªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸããé床ã®åæã¯ãããå°ããªã¯ãŒã¯ã°ã«ãŒãã®ããã©ãŒãã³ã¹ãåäžãããããšããããŸãã
- WebGLã®å¶éïŒWebGLã¯æå€§ã¯ãŒã¯ã°ã«ãŒããµã€ãºã«å¶éã課ããŠããŸãããããã®å¶éã¯ã
gl.getParameter(gl.MAX_COMPUTE_WORK_GROUP_SIZE)ãgl.getParameter(gl.MAX_COMPUTE_WORK_GROUP_INVOCATIONS)ãããã³gl.getParameter(gl.MAX_COMPUTE_WORK_GROUP_COUNT)ã䜿çšããŠã¯ãšãªã§ããŸãã
ã¯ãŒã¯ã°ã«ãŒããµã€ãºãã¥ãŒãã³ã°ã®æŠç¥
ãããã®èŠå ã®è€éããèãããšãã¯ãŒã¯ã°ã«ãŒããµã€ãºã®ãã¥ãŒãã³ã°ã«ã¯äœç³»çãªã¢ãããŒããäžå¯æ¬ ã§ãã以äžã«æ¡çšã§ããããã€ãã®æŠç¥ã瀺ããŸãïŒ
1. ãã³ãããŒã¯ããå§ãã
ããããæé©åäœæ¥ã®åºç€ã¯ãã³ãããŒã¯ã§ããç°ãªãã¯ãŒã¯ã°ã«ãŒããµã€ãºã§ã®ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ããã©ãŒãã³ã¹ã枬å®ããããã®ä¿¡é Œã§ããæ¹æ³ãå¿
èŠã§ããããã«ã¯ãã³ã³ãã¥ãŒãã·ã§ãŒããŒãç°ãªãã¯ãŒã¯ã°ã«ãŒããµã€ãºã§ç¹°ãè¿ãå®è¡ããå®è¡æéãæž¬å®ã§ãããã¹ãç°å¢ãäœæããå¿
èŠããããŸããç°¡åãªã¢ãããŒãã¯ãperformance.now()ã䜿çšããŠgl.dispatchCompute()åŒã³åºãã®ååŸã§æéãæž¬å®ããããšã§ãã
äŸïŒ
const workgroupSizeX = 8;
const workgroupSizeY = 8;
const workgroupSizeZ = 1;
gl.useProgram(computeProgram);
// ãŠããã©ãŒã ãšãã¯ã¹ãã£ãèšå®
gl.dispatchCompute(width / workgroupSizeX, height / workgroupSizeY, 1);
gl.memoryBarrier(gl.SHADER_STORAGE_BARRIER_BIT);
gl.finish(); // ã¿ã€ãã³ã°æž¬å®åã«å®äºãä¿èšŒ
const startTime = performance.now();
for (let i = 0; i < numIterations; ++i) {
gl.dispatchCompute(width / workgroupSizeX, height / workgroupSizeY, 1);
gl.memoryBarrier(gl.SHADER_STORAGE_BARRIER_BIT); // æžã蟌ã¿ãå¯èŠã§ããããšãä¿èšŒ
gl.finish();
}
const endTime = performance.now();
const elapsedTime = (endTime - startTime) / numIterations;
console.log(`ã¯ãŒã¯ã°ã«ãŒããµã€ãº (${workgroupSizeX}, ${workgroupSizeY}, ${workgroupSizeZ}): ${elapsedTime.toFixed(2)} ms`);
ãã³ãããŒã¯ã®äž»ãªèæ ®äºé ïŒ
- ãŠã©ãŒã ã¢ããïŒæž¬å®ãéå§ããåã«ã³ã³ãã¥ãŒãã·ã§ãŒããŒãæ°åå®è¡ããŠãGPUããŠã©ãŒã ã¢ãããããåæã®ããã©ãŒãã³ã¹å€åãé¿ããŸãã
- è€æ°åã®å埩ïŒã³ã³ãã¥ãŒãã·ã§ãŒããŒãè€æ°åå®è¡ããå®è¡æéãå¹³åããŠãã€ãºã枬å®èª€å·®ã®åœ±é¿ãæžãããŸãã
- åæïŒ
gl.memoryBarrier()ãšgl.finish()ã䜿çšããŠãå®è¡æéãæž¬å®ããåã«ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®å®è¡ãå®äºãããã¹ãŠã®ã¡ã¢ãªæžã蟌ã¿ãå¯èŠã§ããããšãä¿èšŒããŸãããããããªããšãå ±åãããæéã¯å®éã®èšç®æéãæ£ç¢ºã«åæ ããªãå¯èœæ§ããããŸãã - åçŸæ§ïŒçµæã®ã°ãã€ããæå°éã«æããããããã³ãããŒã¯ç°å¢ãç°ãªãå®è¡éã§äžè²«ããŠããããšã確èªããŸãã
2. ã¯ãŒã¯ã°ã«ãŒããµã€ãºã®äœç³»çãªæ¢çŽ¢
ãã³ãããŒã¯èšå®ãã§ããããããŸããŸãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã詊ãå§ããããšãã§ããŸããè¯ãåºçºç¹ã¯ãã¯ãŒã¯ã°ã«ãŒãã®å次å ã«2ã®ã¹ãä¹ïŒäŸïŒ1, 2, 4, 8, 16, 32, 64, ...ïŒã詊ãããšã§ãããŸããWebGLã«ãã£ãŠèª²ãããå¶éãèæ ®ããããšãéèŠã§ãã
äŸïŒ
const maxWidthgroupSize = gl.getParameter(gl.MAX_COMPUTE_WORK_GROUP_SIZE)[0];
const maxHeightgroupSize = gl.getParameter(gl.MAX_COMPUTE_WORK_GROUP_SIZE)[1];
const maxZWorkgroupSize = gl.getParameter(gl.MAX_COMPUTE_WORK_GROUP_SIZE)[2];
for (let x = 1; x <= maxWidthgroupSize; x *= 2) {
for (let y = 1; y <= maxHeightgroupSize; y *= 2) {
for (let z = 1; z <= maxZWorkgroupSize; z *= 2) {
if (x * y * z <= gl.getParameter(gl.MAX_COMPUTE_WORK_GROUP_INVOCATIONS)) {
// x, y, zãã¯ãŒã¯ã°ã«ãŒããµã€ãºãšããŠèšå®ãããã³ãããŒã¯ãå®è¡
}
}
}
}
ãããã®ç¹ãèæ ®ããŠãã ããïŒ
- ããŒã«ã«ã¡ã¢ãªäœ¿çšéïŒã³ã³ãã¥ãŒãã·ã§ãŒããŒã倧éã®ããŒã«ã«ã¡ã¢ãªïŒã¯ãŒã¯ã°ã«ãŒãå ã®å ±æã¡ã¢ãªïŒã䜿çšããå Žåãå©çšå¯èœãªããŒã«ã«ã¡ã¢ãªãè¶ ããªãããã«ã¯ãŒã¯ã°ã«ãŒããµã€ãºãå°ããããå¿ èŠããããããããŸããã
- ã¯ãŒã¯ããŒãã®ç¹æ§ïŒã¯ãŒã¯ããŒãã®æ§è³ªããæé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã«åœ±é¿ãäžããå¯èœæ§ããããŸããäŸãã°ãã¯ãŒã¯ããŒãã«å€ãã®åå²ãæ¡ä»¶ä»ãå®è¡ãå«ãŸããå Žåãããå°ããªã¯ãŒã¯ã°ã«ãŒãã®æ¹ãå¹ççãããããŸããã
- ã¯ãŒã¯ã¢ã€ãã ã®ç·æ°ïŒã¯ãŒã¯ã¢ã€ãã ã®ç·æ°ïŒ
gl.dispatchCompute(x, y, z) * workgroupSizeX * workgroupSizeY * workgroupSizeZïŒãGPUãå®å šã«æŽ»çšããã®ã«ååã§ããããšã確èªããŠãã ããããã£ã¹ãããããã¯ãŒã¯ã¢ã€ãã ãå°ãªããããšã䜿çšçãäœäžããå¯èœæ§ããããŸãã
3. ã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ã®åæ
åè¿°ã®ããã«ãã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ã¯ããã©ãŒãã³ã¹ã«ãããŠéèŠãªåœ¹å²ãæãããŸããçæ³çã«ã¯ãã¯ãŒã¯ã°ã«ãŒãå ã®ã¯ãŒã¯ã¢ã€ãã ã¯ãã¡ã¢ãªåž¯åå¹ ãæå€§åããããã«é£ç¶ããã¡ã¢ãªäœçœ®ã«ã¢ã¯ã»ã¹ãã¹ãã§ããããã¯ã³ã¢ã¬ã¹ïŒcoalescedïŒã¡ã¢ãªã¢ã¯ã»ã¹ãšããŠç¥ãããŠããŸãã
äŸïŒ
2Dç»åãåŠçããã·ããªãªãèããŠã¿ãŸããããåã¯ãŒã¯ã¢ã€ãã ãåäžã®ãã¯ã»ã«ãåŠçãã責任ãããå Žåã2Dã°ãªããïŒäŸïŒ8x8ïŒã«é 眮ãããè¡åªå é ã§ãã¯ã»ã«ã«ã¢ã¯ã»ã¹ããã¯ãŒã¯ã°ã«ãŒãã¯ãã³ã¢ã¬ã¹ã¡ã¢ãªã¢ã¯ã»ã¹ã瀺ããŸããå¯Ÿç §çã«ãååªå é ã§ãã¯ã»ã«ã«ã¢ã¯ã»ã¹ãããšãå¹çã®æªãã¹ãã©ã€ãã¡ã¢ãªã¢ã¯ã»ã¹ã«ã€ãªãããŸãã
ã¡ã¢ãªã¢ã¯ã»ã¹ãæ¹åããããã®ãã¯ããã¯ïŒ
- ããŒã¿æ§é ã®åé 眮ïŒã³ã¢ã¬ã¹ã¡ã¢ãªã¢ã¯ã»ã¹ãä¿é²ããããã«ããŒã¿æ§é ãåç·šæããŸãã
- ããŒã«ã«ã¡ã¢ãªã®äœ¿çšïŒããŒã¿ãããŒã«ã«ã¡ã¢ãªïŒã¯ãŒã¯ã°ã«ãŒãå ã®å ±æã¡ã¢ãªïŒã«ã³ããŒããããŒã«ã«ã³ããŒã§èšç®ãå®è¡ããŸããããã«ãããã°ããŒãã«ã¡ã¢ãªã¢ã¯ã»ã¹ã®æ°ãå€§å¹ ã«åæžã§ããŸãã
- ã¹ãã©ã€ãã®æé©åïŒã¹ãã©ã€ãã¡ã¢ãªã¢ã¯ã»ã¹ãé¿ããããªãå Žåã¯ãã¹ãã©ã€ããæå°éã«æããããã«ããŠãã ããã
4. åæãªãŒããŒãããã®æå°å
barrier()ãã¢ãããã¯æäœãªã©ã®åæã¡ã«ããºã ã¯ãã¯ãŒã¯ã°ã«ãŒãå
ã®ã¯ãŒã¯ã¢ã€ãã ã®åäœã調æŽããããã«å¿
èŠã§ããããããé床ã®åæã¯å€§ããªãªãŒããŒããããåŒãèµ·ãããããã©ãŒãã³ã¹ãäœäžãããå¯èœæ§ããããŸãã
åæãªãŒããŒããããåæžããããã®ãã¯ããã¯ïŒ
- äŸåé¢ä¿ã®åæžïŒã¯ãŒã¯ã¢ã€ãã éã®ããŒã¿äŸåæ§ãæå°éã«æããããã«ã³ã³ãã¥ãŒãã·ã§ãŒããŒã³ãŒããåæ§ç¯ããŸãã
- ãŠã§ãŒãã¬ãã«æäœã®äœ¿çšïŒäžéšã®GPUã¯ããŠã§ãŒãã¬ãã«æäœïŒãµãã°ã«ãŒãæäœãšãåŒã°ããïŒããµããŒãããŠãããããã«ãããŠã§ãŒãïŒããŒããŠã§ã¢ã§å®çŸ©ãããã¯ãŒã¯ã¢ã€ãã ã®ã°ã«ãŒãïŒå ã®ã¯ãŒã¯ã¢ã€ãã ãæç€ºçãªåæãªãã§ããŒã¿ãå ±æã§ããŸãã
- ã¢ãããã¯æäœã®æ éãªäœ¿çšïŒã¢ãããã¯æäœã¯ãå ±æã¡ã¢ãªãžã®ã¢ãããã¯ãªæŽæ°ãè¡ãæ¹æ³ãæäŸããŸããããããç¹ã«åãã¡ã¢ãªäœçœ®ãžã®ç«¶åãããå Žåããããã¯é«ã³ã¹ãã«ãªãå¯èœæ§ããããŸããçµæãèç©ããããã«ããŒã«ã«ã¡ã¢ãªã䜿çšããã¯ãŒã¯ã°ã«ãŒãã®æåŸã«åäžã®ã¢ãããã¯æŽæ°ãå®è¡ãããªã©ã代æ¿ã¢ãããŒããæ€èšããŠãã ããã
5. é©å¿çãªã¯ãŒã¯ã°ã«ãŒããµã€ãºãã¥ãŒãã³ã°
æé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã¯ãå ¥åããŒã¿ãçŸåšã®GPUè² è·ã«ãã£ãŠç°ãªãå ŽåããããŸããå Žåã«ãã£ãŠã¯ããããã®èŠå ã«åºã¥ããŠã¯ãŒã¯ã°ã«ãŒããµã€ãºãåçã«èª¿æŽããããšãæçãªããšããããŸããããã¯é©å¿çãªã¯ãŒã¯ã°ã«ãŒããµã€ãºãã¥ãŒãã³ã°ãšåŒã°ããŸãã
äŸïŒ
ç°ãªããµã€ãºã®ç»åãåŠçããŠããå Žåããã£ã¹ããããããã¯ãŒã¯ã°ã«ãŒãã®æ°ãç»åãµã€ãºã«æ¯äŸããããã«ã¯ãŒã¯ã°ã«ãŒããµã€ãºã調æŽã§ããŸãããããã¯ãGPUã®è² è·ãç£èŠããGPUããã§ã«éãè² è·ãããŠããå Žåã¯ã¯ãŒã¯ã°ã«ãŒããµã€ãºãå°ããããããšãã§ããŸãã
å®è£ ã«é¢ããèæ ®äºé ïŒ
- ãªãŒããŒãããïŒé©å¿çãªã¯ãŒã¯ã°ã«ãŒããµã€ãºãã¥ãŒãã³ã°ã¯ãããã©ãŒãã³ã¹ã枬å®ããã¯ãŒã¯ã°ã«ãŒããµã€ãºãåçã«èª¿æŽããå¿ èŠãããããããªãŒããŒãããã䌎ããŸãããã®ãªãŒããŒãããã¯ãæœåšçãªããã©ãŒãã³ã¹åäžãšæ¯èŒæ€èšããå¿ èŠããããŸãã
- ãã¥ãŒãªã¹ãã£ã¯ã¹ïŒã¯ãŒã¯ã°ã«ãŒããµã€ãºã調æŽããããã®ãã¥ãŒãªã¹ãã£ã¯ã¹ã®éžæã¯ãããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸããç¹å®ã®ã¯ãŒã¯ããŒãã«æé©ãªãã¥ãŒãªã¹ãã£ã¯ã¹ãèŠã€ããã«ã¯ãæ éãªå®éšãå¿ èŠã§ãã
å®è·µçãªäŸãšã±ãŒã¹ã¹ã¿ãã£
ã¯ãŒã¯ã°ã«ãŒããµã€ãºã®ãã¥ãŒãã³ã°ãå®éã®ã·ããªãªã§ããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ãäžããããããã€ãã®å®è·µçãªäŸãèŠãŠã¿ãŸãããïŒ
äŸ1ïŒç»åãã£ã«ã¿ãªã³ã°
ç»åã«ãŒãããã£ã«ã¿ãŒãé©çšããã³ã³ãã¥ãŒãã·ã§ãŒããŒãèããŠã¿ãŸããããåçŽãªã¢ãããŒãã¯ãå°ããªã¯ãŒã¯ã°ã«ãŒããµã€ãºïŒäŸïŒ1x1ïŒã䜿çšããåã¯ãŒã¯ã¢ã€ãã ã«åäžã®ãã¯ã»ã«ãåŠçãããããšãããããŸããããããããã®ã¢ãããŒãã¯ã³ã¢ã¬ã¹ã¡ã¢ãªã¢ã¯ã»ã¹ã®æ¬ åŠã«ããéåžžã«éå¹çã§ãã
ã¯ãŒã¯ã°ã«ãŒããµã€ãºã8x8ã16x16ã«å¢ãããã¯ãŒã¯ã°ã«ãŒããç»åãã¯ã»ã«ãšæŽåãã2Dã°ãªããã«é 眮ããããšã§ãã³ã¢ã¬ã¹ã¡ã¢ãªã¢ã¯ã»ã¹ãå®çŸããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸããããã«ãé¢é£ãããã¯ã»ã«ã®è¿åãå ±æããŒã«ã«ã¡ã¢ãªã«ã³ããŒããããšã§ãåé·ãªã°ããŒãã«ã¡ã¢ãªã¢ã¯ã»ã¹ãåæžãããã£ã«ã¿ãªã³ã°æäœãé«éåã§ããŸãã
äŸ2ïŒããŒãã£ã¯ã«ã·ãã¥ã¬ãŒã·ã§ã³
ããŒãã£ã¯ã«ã·ãã¥ã¬ãŒã·ã§ã³ã§ã¯ãã³ã³ãã¥ãŒãã·ã§ãŒããŒãåããŒãã£ã¯ã«ã®äœçœ®ãšéåºŠãæŽæ°ããããã«ãã䜿çšãããŸããæé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã¯ãããŒãã£ã¯ã«ã®æ°ãšæŽæ°ããžãã¯ã®è€éãã«äŸåããŸããæŽæ°ããžãã¯ãæ¯èŒçåçŽãªå Žåã¯ããã倧ããªã¯ãŒã¯ã°ã«ãŒããµã€ãºã䜿çšããŠããå€ãã®ããŒãã£ã¯ã«ã䞊åã«åŠçã§ããŸããããããæŽæ°ããžãã¯ã«å€ãã®åå²ãæ¡ä»¶ä»ãå®è¡ãå«ãŸããå Žåãããå°ããªã¯ãŒã¯ã°ã«ãŒãã®æ¹ãå¹ççãããããŸããã
ããã«ãããŒãã£ã¯ã«ãäºãã«çžäºäœçšããå ŽåïŒäŸïŒè¡çªæ€åºãåå Žãä»ããŠïŒãããŒãã£ã¯ã«ã®æŽæ°ãæ£ããè¡ãããããšãä¿èšŒããããã«åæã¡ã«ããºã ãå¿ èŠã«ãªãå ŽåããããŸãããããã®åæã¡ã«ããºã ã®ãªãŒããŒãããã¯ãã¯ãŒã¯ã°ã«ãŒããµã€ãºãéžæããéã«èæ ®ããå¿ èŠããããŸãã
ã±ãŒã¹ã¹ã¿ãã£ïŒWebGLã¬ã€ãã¬ãŒãµãŒã®æé©å
ãã«ãªã³ã§WebGLããŒã¹ã®ã¬ã€ãã¬ãŒãµãŒã«åãçµãã§ãããããžã§ã¯ãããŒã ã¯ãåœåããã©ãŒãã³ã¹ã®äœãã«æ©ãã§ããŸããã圌ãã®ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®äžæ žã¯ãã¬ã€ã®äº€å·®ã«åºã¥ããŠåãã¯ã»ã«ã®è²ãèšç®ããã³ã³ãã¥ãŒãã·ã§ãŒããŒã«å€§ããäŸåããŠããŸããããããã¡ã€ãªã³ã°ã®çµæãã¯ãŒã¯ã°ã«ãŒããµã€ãºãé倧ãªããã«ããã¯ã§ããããšã倿ããŸããã圌ãã¯ïŒ4, 4, 1ïŒã®ã¯ãŒã¯ã°ã«ãŒããµã€ãºããå§ããŸããããããã¯å€ãã®å°ããªã¯ãŒã¯ã°ã«ãŒããçã¿åºããGPUãªãœãŒã¹ãååã«æŽ»çšãããŠããŸããã§ããã
ãã®åŸã圌ãã¯äœç³»çã«ç°ãªãã¯ãŒã¯ã°ã«ãŒããµã€ãºã詊ããŸãããNVIDIA GPUã§ã¯ïŒ8, 8, 1ïŒã®ã¯ãŒã¯ã°ã«ãŒããµã€ãºãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãçºèŠããŸããããäžéšã®AMD GPUã§ã¯ããŒã«ã«ã¡ã¢ãªå¶éãè¶ ããåé¡ãçºçããŸãããããã«å¯ŸåŠããããã圌ãã¯æ€åºãããGPUãã³ããŒã«åºã¥ããŠã¯ãŒã¯ã°ã«ãŒããµã€ãºãéžæããå®è£ ãè¡ããŸãããæçµçãªå®è£ ã§ã¯ãNVIDIAã«ã¯ïŒ8, 8, 1ïŒããAMDã«ã¯ïŒ4, 4, 1ïŒã䜿çšããŸããããŸããã¬ã€ãšãªããžã§ã¯ãã®äº€å·®ãã¹ããã¯ãŒã¯ã°ã«ãŒãã§ã®å ±æã¡ã¢ãªäœ¿çšãæé©åãããã©ãŠã¶ã§ã¬ã€ãã¬ãŒãµãŒã䜿çšå¯èœã«ãªããŸãããããã«ãããã¬ã³ããªã³ã°æéãåçã«æ¹åãããç°ãªãGPUã¢ãã«éã§ãäžè²«æ§ãä¿ãããããã«ãªããŸããã
ãã¹ããã©ã¯ãã£ã¹ãšæšå¥šäºé
WebGLã³ã³ãã¥ãŒãã·ã§ãŒããŒã«ãããã¯ãŒã¯ã°ã«ãŒããµã€ãºãã¥ãŒãã³ã°ã®ããã®ãã¹ããã©ã¯ãã£ã¹ãšæšå¥šäºé ã以äžã«ç€ºããŸãïŒ
- ãã³ãããŒã¯ããå§ããïŒåžžã«ãç°ãªãã¯ãŒã¯ã°ã«ãŒããµã€ãºã§ã®ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ããã©ãŒãã³ã¹ã枬å®ããããã®ãã³ãããŒã¯èšå®ãäœæããããšããå§ããŠãã ããã
- WebGLã®å¶éãçè§£ããïŒWebGLã課ãæå€§ã¯ãŒã¯ã°ã«ãŒããµã€ãºãšãã£ã¹ãããå¯èœãªã¯ãŒã¯ã¢ã€ãã ã®ç·æ°ã«é¢ããå¶éãèªèããŠãã ããã
- GPUã¢ãŒããã¯ãã£ãèæ ®ããïŒã¯ãŒã¯ã°ã«ãŒããµã€ãºãéžæããéã«ã¯ãã¿ãŒã²ããGPUã®ã¢ãŒããã¯ãã£ãèæ ®ã«å ¥ããŠãã ããã
- ã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãåæããïŒã¡ã¢ãªåž¯åå¹ ãæå€§åããããã«ãã³ã¢ã¬ã¹ã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãç®æããŠãã ããã
- åæãªãŒããŒããããæå°åããïŒåæã®å¿ èŠæ§ãæå°éã«æããããã«ãã¯ãŒã¯ã¢ã€ãã éã®ããŒã¿äŸåæ§ãæžãããŠãã ããã
- ããŒã«ã«ã¡ã¢ãªãè³¢ã䜿çšããïŒã°ããŒãã«ã¡ã¢ãªã¢ã¯ã»ã¹ã®æ°ãæžããããã«ããŒã«ã«ã¡ã¢ãªã䜿çšããŠãã ããã
- äœç³»çã«å®éšããïŒããŸããŸãªã¯ãŒã¯ã°ã«ãŒããµã€ãºãäœç³»çã«è©Šããããã©ãŒãã³ã¹ãžã®åœ±é¿ã枬å®ããŠãã ããã
- ã³ãŒãããããã¡ã€ãªã³ã°ããïŒãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããã³ã³ãã¥ãŒãã·ã§ãŒããŒã³ãŒããæé©åããŠãã ããã
- è€æ°ã®ããã€ã¹ã§ãã¹ãããïŒããŸããŸãªããã€ã¹ã§ã³ã³ãã¥ãŒãã·ã§ãŒããŒããã¹ãããç°ãªãGPUããã©ã€ããŒéã§è¯å¥œãªããã©ãŒãã³ã¹ãçºæ®ããããšã確èªããŠãã ããã
- é©å¿çãªãã¥ãŒãã³ã°ãæ€èšããïŒå ¥åããŒã¿ãGPUè² è·ã«åºã¥ããŠã¯ãŒã¯ã°ã«ãŒããµã€ãºãåçã«èª¿æŽããå¯èœæ§ãæ¢ã£ãŠãã ããã
- çºèŠãææžåããïŒãã¹ãããã¯ãŒã¯ã°ã«ãŒããµã€ãºãšåŸãããããã©ãŒãã³ã¹çµæãææžåããŠãã ãããããã¯å°æ¥ãã¯ãŒã¯ã°ã«ãŒããµã€ãºãã¥ãŒãã³ã°ã«é¢ããæ å ±ã«åºã¥ããæ±ºå®ãäžãã®ã«åœ¹ç«ã¡ãŸãã
çµè«
ã¯ãŒã¯ã°ã«ãŒããµã€ãºã®ãã¥ãŒãã³ã°ã¯ãããã©ãŒãã³ã¹åäžã®ããã«WebGLã³ã³ãã¥ãŒãã·ã§ãŒããŒãæé©åããäžã§éèŠãªåŽé¢ã§ããæé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã«åœ±é¿ãäžããèŠå ãçè§£ããäœç³»çãªãã¥ãŒãã³ã°ã¢ãããŒããæ¡çšããããšã§ãGPUã®æœåšèœåãæå€§éã«åŒãåºããèšç®éçŽåã®Webã¢ããªã±ãŒã·ã§ã³ã§å€§å¹ ãªããã©ãŒãã³ã¹åäžãéæã§ããŸãã
æé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã¯ãç¹å®ã®ã¯ãŒã¯ããŒããã¿ãŒã²ããGPUã¢ãŒããã¯ãã£ãããã³ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ã«å€§ããäŸåããããšãå¿ããªãã§ãã ããããããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã«æé©ãªã¯ãŒã¯ã°ã«ãŒããµã€ãºãèŠã€ããã«ã¯ãæ éãªå®éšãšãããã¡ã€ãªã³ã°ãäžå¯æ¬ ã§ãããã®èšäºã§æŠèª¬ãããã¹ããã©ã¯ãã£ã¹ãšæšå¥šäºé ã«åŸãããšã§ãWebGLã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ããã©ãŒãã³ã¹ãæå€§åããããã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸãã
WebGLã³ã³ãã¥ãŒãã·ã§ãŒããŒã®äžçãæ¢æ±ãç¶ããäžã§ãããã§èª¬æãããã¯ããã¯ã¯åãªãçè«çãªæŠå¿µã§ã¯ãªãããšãå¿ããªãã§ãã ããããããã¯ãçŸå®äžçã®åé¡ã解決ãã驿°çãªWebã¢ããªã±ãŒã·ã§ã³ãäœæããããã«äœ¿çšã§ããå®è·µçãªããŒã«ã§ãããããé£ã³èŸŒãã§ãå®éšããæé©åãããã³ã³ãã¥ãŒãã·ã§ãŒããŒã®åãçºèŠããŠãã ããïŒ