½Ì³ÌÖеÄÓ¢Îĺܼòµ¥£¬ÎÒÏàÐÅѧOpenCLµÄÈ˶¼ÄÜ¿´µÃ¶®£¬¶øÇÒ¿´ÔÖÔζµÄÓ¢ÎıíÊö£¬¸üÓÐÀûÓÚÎÒÃÇÁ˽â¸÷ÖÖÊõÓïµÄÀ´ÁúÈ¥Âö¡£
ÎÒ°ÑÕâЩ½Ì³Ì·Òë³É×Ô¼ºµÄÖÐÎıíÊö£¬Ö÷ÒªÊÇÇ¿»¯Àí½âÐèÒª£¬ÆäʵÎÒµÄÓ¢ÎĺÜÀá£
Ò»¡¢²¢ÐмÆËã¸ÅÊö
ÔÚ¼ÆËã»úÊõÓïÖУ¬²¢ÐÐÐÔÊÇÖ¸£º°ÑÒ»¸ö¸´ÔÓÎÊÌâ,·Ö½â³É¶à¸öÄÜͬʱ´¦ÀíµÄ×ÓÎÊÌâµÄÄÜÁ¦¡£ÒªÊµÏÖ²¢ÐмÆË㣬Ê×ÏÈÎÒÃÇÒªÓÐÎïÀíÉÏÄܹ»ÊµÏÖ²¢ÐмÆËãµÄÓ²¼þÉ豸£¬±ÈÈç¶àºËCPU£¬Ã¿¸öºËÄÜͬʱʵÏÖËãÊõ»òÂß¼ÔËËã¡£
ͨ³££¬ÎÒÃÇͨ¹ýGPUʵÏÖÁ½ÀಢÐмÆË㣺
ÈÎÎñ²¢ÐУº°ÑÒ»¸öÎÊÌâ·Ö½âΪÄܹ»Í¬Ê±Ö´ÐеĶà¸öÈÎÎñ¡£
Êý¾Ý²¢ÐУºÍ¬Ò»¸öÈÎÎñÄÚ£¬ËüµÄ¸÷¸ö²¿·ÖͬʱִÐС£
ÏÂÃæÎÒÃÇͨ¹ýÒ»¸öÅ©³¡Ö÷¹ÍÓ¶¹¤ÈËժƻ¹ûµÄÀý×ÓÀ´ÃèÊö²»Í¬ÖÖÀàµÄ²¢ÐмÆËã¡£

1.ժƻ¹ûµÄ¹¤È˾ÍÊÇÓ²¼þÉϵIJ¢Ðд¦Àíµ¥Ôª£¨process elements)¡£
2.Ê÷¾ÍÊÇÒªÖ´ÐеÄÈÎÎñ¡£
3.Æ»¹û¾ÍÊÇÒª´¦ÀíµÄÊý¾Ý¡£
´®ÐеÄÈÎÎñ´¦Àí¾ÍÈçÏÂͼËùʾ£¬Ò»¸ö¹¤È˱³×ÅÌÝ×ÓÕªÍêËùÓÐÊ÷ÉÏµÄÆ»¹û£¨Ò»¸ö´¦Àíµ¥Ôª´¦ÀíÍêËùÓÐÈÎÎñµÄÊý¾Ý£©¡£

Êý¾Ý²¢ÐоͺñÈÅ©³¡Ö÷¹ÍÓ¶Á˺ö๤ÈËÀ´ÕªÍêÒ»¸öÊ÷ÉÏµÄÆ»¹û£¨¶à¸ö´¦Àíµ¥Ôª²¢ÐÐÍê³ÉÒ»¸öÈÎÎñÖеÄÊý¾Ý£©£¬ÕâÑù¾ÍÄܺܿìÕªÍêÒ»¿ÅÊ÷ÉÏµÄÆ»¹û¡£

Å©³¡Ö÷Ò²¿ÉÒÔΪÿ¿ÃÊ÷°²ÅÅÒ»¸ö¹¤ÈË£¬Õâ¾ÍºÃ±ÈÈÎÎñ²¢ÐС£ÔÚÿ¸öÈÎÎñÄÚ£¬ÓÉÓÚÖ»ÓÐÒ»¸ö¹¤ÈË£¬ËùÒÔÊÇ´®ÐÐÖ´Ðе쬵«ÈÎÎñÖ®¼äÊDz¢Ðеġ£

¶ÔÒ»¸ö¸´ÔÓÎÊÌ⣬ӰÏì²¢ÐмÆËãµÄÒòËØºÜ¶à¡£Í¨³££¬ÎÒÃǶ¼ÊÇͨ¹ý·Ö½âÎÊÌâµÄ·½Ê½À´ÊµÊ©²¢Ëã·¨ÐС£
ÕâÓÖ°üÀ¨Á½·½ÃæÄÚÈÝ£º
1.ÈÎÎñ·Ö½â£º°ÑËã·¨·Ö½â³ÉºÜ¶àµÄСÈÎÎñ£¬¾ÍÏñÇ°ÃæµÄÀý×ÓÖУ¬°Ñ¹ûÔ°°´Æ»¹ûÊ÷½øÐл®·Ö£¬ÕâʱÎÒÃDz¢²»¹Ø×¢Êý¾Ý£¬Ò²¾ÍÊÇ˵²»¹Ø×¢Ã¿¸öÊ÷Éϵ½µ×ÓжàÉÙ¸öÆ»¹û¡£
2.Êý¾Ý·Ö½â£º¾ÍÊǰѺܶàÊý¾Ý£¬·Ö³É²»Í¬µÄ¡¢ÀëÉ¢µÄС¿é£¬ÕâЩÊý¾Ý¿éÄܹ»±»²¢ÐÐÖ´ÐУ¬¾ÍºÃ±ÈÇ°ÃæÀý×ÓÖÐµÄÆ»¹û¡£
ͨ³£ÎÒÃǰ´ÕÕËã·¨Ö®¼äµÄÒÀÀµ¹ØÏµÀ´·Ö½âÈÎÎñ£¬ÕâÑù¾ÍÐγÉÁËÒ»¸öÈÎÎñ¹ØÏµÍ¼¡£Ò»¸öÈÎÎñÖ»ÓÐûÓÐÒÀÀµÈÎÎñµÄʱºò£¬²ÅÄܹ»±»Ö´ÐС£

ÕâÓеãÀàËÆÓÚÊý¾Ý½á¹¹ÖеÄÓÐÏòÎÞ»·Í¼£¬Á½¸öûÓÐÁ¬Í¨Â·¾¶µÄÈÎÎñÖ®¼ä¿ÉÒÔ²¢ÐÐÖ´ÐС£ÏÂÃæÔÙ¸øÒ»¸ö¿¾Ãæ°üµÄÀý×Ó£¬Èç¹ûËùʾ£¬Ô¤ÈÈ¿¾ÏäºÍ¹ºÂòÃæ·ÛÌÇÁ½¸öÈÎÎñÖ®¼ä¿ÉÒÔ²¢ÐÐÖ´ÐС£

¶Ô´ó¶àÊý¿ÆÑ§¼ÆËãºÍ¹¤³ÌÓ¦ÓÃÀ´Ëµ£¬Êý¾Ý·Ö½âÒ»°ã¶¼ÊÇ»ùÓÚÊä³öÊý¾Ý,ÀýÈ磺
1.ÔÚÒ»¸±Í¼ÏñÖУ¬¶ÔÒ»¸ö»¬¶¯´°¿Ú£¨ÀýÈ磺3*3ÏñËØ)ÄÚµÄÏñËØÊµÊ©Â˲¨²Ù×÷£¬¿ÉÒԵõ½Ò»¸öÊä³öÏñËØµÄ¾í»ý¡£
2.µÚÒ»¸öÊäÈë¾ØÕóµÄµÚiÐгËÒÔµÚ¶þ¸öÊäÈë¾ØÕóµÄµÚjÁУ¬µÃµ½µÄÏòÁ¿ºÍ¼´ÎªÊä³ö¾ØÕóµÚiÐУ¬µÚjÁеÄÔªËØ¡£
ÕâÖÖ·½·¨¶ÔÓÚÊäÈëºÍÊä³öÊý¾ÝÊÇÒ»¶ÔÒ»£¬»òÕß¶à¶ÔÒ»µÄ¶ÔÓ¦¹ØÏµ±È½ÏÓÐЧ¡£
Ò²ÓеÄÊý¾Ý·Ö½âËã·¨ÊÇ»ùÓÚÊäÈëÊý¾ÝµÄ£¬Õâʱ£¬ÊäÈëÊý¾ÝºÍÊä³öÊý¾ÝÒ»°ãÊÇÒ»¶Ô¶àµÄ¹ØÏµ£¬±ÈÈçÇóͼÏñµÄÖ±·½Í¼£¬ÎÒÃÇÒª°Ñÿ¸öÏñËØ·Åµ½¶ÔÓ¦µÄ²ÛÖÐ(bins£¬¶ÔÓÚ»Ò¶Èͼ£¬binÊýÁ¿Í¨³£ÊÇ256£©¡£Ò»¸öËÑË÷º¯Êý£¬ÊäÈë¿ÉÄÜÊǶà¸öÊý¾Ý£¬Êä³öÈ´Ö»ÓÐÒ»¸öÖµ¡£¶ÔÓÚÕâÀàÓ¦Óã¬ÎÒÃÇÒ»°ãÓÃÿ¸öÏ̼߳ÆËãÊä³öµÄÒ»²¿·Ö£¬È»ºóͨ¹ýͬ²½ÒÔ¼°Ô×Ó²Ù×÷µÃµ½×îÖÕµÄÖµ£¬OpenCLÖÐÇó×îСֵµÄkernelº¯Êý¾ÍÊǵäÐÍ´ú±í[¿ÉÒÔ¿´ÏÂATI
Stream Computing OpenCL programming guideµÚ¶þÕÂÖÐÇó×îСֵµÄkernelÀý×Ó]¡£
ͨ³£À´Ëµ£¬ÔõÑù·Ö½âÎÊÌâºÍ¾ßÌåËã·¨Óйأ¬¶øÇÒ»¹Òª¿¼ÂÇ×Ô¼ºÊ¹ÓõÄÓ²¼þºÍÈí¼þ£¬±ÈÈçAMD
GPUƽ̨ºÍNvdia GPUƽ̨µÄÓÅ»¯¾ÍÓкܶ಻ͬ¡£
¶þ¡¢³£ÓûùÓÚÓ²¼þºÍÈí¼þµÄ²¢ÐÐ
ÔÚÉϸöʵ¼Ê90Äê´ú£¬²¢ÐмÆËãÖ÷ÒªÑо¿ÈçºÎÔÚcpuÉÏʵʩָ×Ô¶¯µÄÖ¸Áî¼¶²¢ÐС£
1.ͬʱ·¢Éä¶àÌõÖ¸Á֮¼äûÓÐÒÀÀµ¹ØÏµ£©£¬²¢ÐÐÖ´ÐÐÕâЩָÁî¡£
2.ÔÚ±¾½Ì³ÌÖУ¬ÎÒô²»½²Êö×Ô¶¯µÄÓ²¼þ¼¶²¢ÐУ¬¸ÐÐËȤµÄ»°£¬¿ÉÒÔ¿´¿´¼ÆËã»úÌåϵ½á¹¹µÄ½Ì³Ì¡£
¸ß²ãµÄ²¢ÐУ¬±ÈÈçÏ̼߳¶±ðµÄ²¢ÐУ¬Ò»°ãºÜÄÑ×Ô¶¯»¯£¬ÐèÒª³ÌÐòÔ±¸æËß¼ÆËã»ú£¬¸Ã×öʲô£¬²»¸Ã×öʲô¡£Õâʱ£¬³ÌÐòÔ±»¹Òª¿¼ÂÇÓ²¼þµÄ¾ßÌåÖ¸±ê£¬Í¨³£Ìض¨Ó²¼þ¶¼ÊÇÊÊÓ¦ÓÚijһÀಢÐбà³Ì£¬±ÈÈç¶àºËcpu¾ÍÊʺϻùÓÚÈÎÎñµÄ²¢Ðбà³Ì£¬¶øGPU¸üÊÊÓ¦ÓÚÊý¾Ý²¢Ðбà³Ì¡£

ÏÖ´úµÄGPUÓкܶà¶ÀÁ¢µÄÔËËãºË£¨processor£©×é³É£¬ÔÚAMD GPUÉϾÍÊÇstream core£¬ÕâЩcoreÄܹ»Ö´ÐÐSIMD²Ù×÷£¨µ¥Ö¸Á¶àÊý¾Ý£©£¬ËùÒÔÌØ±ðÊʺÏÊý¾Ý²¢ÐвÙ×÷¡£Í¨³£GPUÉÏÖ´ÐÐÒ»¸öÈÎÎñ£¬¶¼ÊǰÑÈÎÎñÖеÄÊý¾Ý·ÖÅäµ½¸÷¸ö¶ÀÁ¢µÄcoreÖÐÖ´ÐС£
ÔÚGPUÉÏ£¬ÎÒÃÇÒ»°ãͨ¹ýÑ»·Õ¹¿ª£¬Loop strip mining
¼¼Êõ£¬À´°Ñ´®ÐдúÂë¸Ä³É²¢ÐÐÖ´Ðеġ£±ÈÈçÔÚCPUÉÏ£¬Èç¹ûÎÒÃÇʵÏÖÒ»¸öÏòÁ¿¼Ó·¨£¬´úÂëͨ³£ÈçÏ£º
for(i = 0; i < n; i++) 2: { 3: C[i] = A[i] + B[i]; 4: }
|
ÔÚGPUÉÏ£¬ÎÒÃÇ¿ÉÒÔÉèÖÃn¸öỊ̈߳¬Ã¿¸öÏß³ÌÖ´ÐÐÒ»¸ö¼Ó·¨£¬ÕâÑù´ó´óÌá¸ßÁËÏòÁ¿¼Ó·¨µÄ²¢ÐÐÐÔ¡£
__kernel void VectorAdd(__global const float* a, __global const float* b, __global float* c, int n) 2: { 3: int i = get_global_id(0); 4: c[i] = a[i] + b[i]; 5: }
|

ÉÏÃæÕâ¸öͼչʾÁËÏòÁ¿¼Ó·¨µÄSPMD£¨µ¥Ö¸Áî¶àỊ̈߳©ÊµÏÖ£¬´ÓͼÖпÉÒÔ¿´³öÈçºÎʵʩLoop strip mining
²Ù×÷µÄ¡£
GPUµÄ³ÌÐòÒ»°ã³Æ×÷Kernel³ÌÐò£¬ËüÊÇÒ»ÖÖSPMDµÄ±à³ÌÄ£ÐÍ£¨the Single Program
Multiple Data £©¡£SPMDÖ´ÐÐͬһ¶Î´úÂëµÄ¶à¸öʵÀý£¬Ã¿¸öʵÀý¶ÔÊý¾ÝµÄ²»Í¬²¿·Ö½øÐвÙ×÷¡£
ÔÚÊý¾Ý²¢ÐÐÓ¦ÓÃÖУ¬ÓÃloop strip miningÀ´ÊµÏÖSPMDÊÇ×î³£Óõķ½·¨£º
1.ÔÚ·Ö²¼Ê½ÏµÍ³ÖУ¬ÎÒÃÇÓÃMessage Passing Interface
(MPI)À´ÊµÏÖSPMD¡£
2.ÔÚ¹²ÏíÄÚ´æ²¢ÐÐϵͳÖУ¬ÎÒÃÇÓÃPOSIXÏß³ÌÀ´ÊµÏÖSPMD¡£
3.ÔÚGPUÖУ¬ÎÒÃǾÍÊÇÓÃKernelÀ´ÏÔÏÖSPMD¡£
ÔÚÏÖ´úµÄCPUÉÏ£¬´´½¨Ò»¸öÏ̵߳ĿªÏú»¹ÊǺܴóµÄ£¬Èç¹ûÒªÔÚCPUÉÏʵÏÖSPMD£¬Ã¿¸öÏ̴߳¦ÀíµÄÊý¾Ý¿é¾ÍÒª¾¡Á¿´óµã£¬×ö¸ü¶àµÄÊÂÇ飬ÒÔ±ã¼õÉÙÆ½¾ùÏ߳̿ªÏú¡£µ«ÔÚGPUÉÏ£¬¶¼ÊÇÇáÁ¿¼¶µÄỊ̈߳¬´´½¨¡¢µ÷¶ÈÏ̵߳ĿªÏú±È½ÏС£¬ËùÒÔÎÒÃÇ¿ÉÒÔ×öµ½°ÑÑ»·Íêȫչ¿ª£¬Ò»¸öÏ̴߳¦ÀíÒ»¸öÊý¾Ý¡£

GPUÉϲ¢Ðбà³ÌµÄÓ²¼þÒ»°ã³Æ×÷SIMD¡£Í¨³££¬·¢ÉäÒ»ÌõÖ¸Áîºó£¬ËüÒªÔÚ¶à¸öALUµ¥ÔªÖÐÖ´ÐУ¨ALUµÄÊýÁ¿¼´Ê¹simdµÄ¿í¶È£©£¬ÕâÖÖÉè¼Æ¼õÉÙÁË¿ØÖÆÁ÷µ¥ÔªÒÔ¼¶ALUÏà¹ØµÄÆäËûÓ²¼þÊýÁ¿¡£
SIMDµÄÓ²¼þÈçÏÂͼËùʾ£º

ÔÚÏòÁ¿¼Ó·¨ÖУ¬¿í¶ÈΪ4µÄSIMDµ¥Ôª£¬¿ÉÒÔ°ÑÕû¸öÑ»··ÖΪËĸö²¿·ÖͬʱִÐС£ÔÚ¹¤ÈËժƻ¹ûµÄÀý×ÓÖУ¬¹¤È˵ÄË«ÊÖÀàËÆÓÚSIMDµÄ¿í¶ÈΪ2¡£ÁíÍ⣬ÎÒÃÇÒªÖªµÀ£¬ÏÖÔÚµÄGPUÓ²¼þÉ϶¼ÊÇ»ùÓÚSIMDÉè¼Æ£¬GPUÓ²¼þÒþʽµÄ°ÑSPMDÏß³ÌÓ³Éäµ½SIMD
coreÉÏ¡£¶Ô¿ª·¢ÓÐÈËÔ±À´Ëµ£¬ÎÒÃDz¢²»ÐèÒª¹Ø×¢Ó²¼þÖ´Ðнá¹ûÊÇ·ñÕýÈ·£¬ÎÒÃÇÖ»ÐèÒª¹Ø×¢ËüµÄÐÔÄܾÍOKÁË¡£
CPUÒ»°ã¶¼Ö§³Ö²¢Ðм¶µÄÔ×Ó²Ù×÷£¬ÕâЩ²Ù×÷±£Ö¤²»Í¬µÄÏ̶߳ÁдÊý¾Ý£¬Ï໥֮¼ä²»»á¸ÉÈÅ¡£ÓÐЩGPUÖ§³Öϵͳ·¶Î§µÄ²¢ÐвÙ×÷£¬µ«»áÓкܴó¿ªÏú£¬±ÈÈçGlobal
memoryµÄͬ²½¡£
|