±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬½éÉÜÁËGPU±à³ÌÄ£ÐÍ£¬Ó²¼þÏà¹ØµÄ±³¾°£¬Èí¼þµÄ¿ò¼Ü£¬GPUµÄÄÚ´æÄ£Ð͵ȡ£ |
|
GPU¼ò½é
GPU£¨graphical processing unit£©ÊÇÏÔ¿¨ÄÚÓÃÓÚͼÐδ¦ÀíµÄÆ÷¼þ¡£ºÍCPUÏà±È£¬CPUÊÇ´®ÐÐÖ´ÐУ¬¶øGPUÊǶà¸öºË²¢ÐÐÖ´ÐС£GPUÊÇÒ»¸ö¸ßÐÔÄܵĶàºË´¦ÀíÆ÷£¬ÓкܸߵļÆËãËٶȺÍÊý¾ÝÍÌÍÂÂÊ¡£ÔÚGPUÉϵÄÔËËãÄÜ»ñµÃÏà¶ÔÓÚCPU¶øÑԺܸߵļÓËٱȡ£µÚÒ»¡¢µÚ¶þ´úGPU³öÏÖµÄʱºò£¬GPU²»Êǿɱà³ÌµÄ[4]¡£µ±µÚÈý´úGPU³öÏÖµÄʱºò£¬GPU¿ªÊ¼ÓÃÓÚͼÐαà³Ì£¬Ñо¿ÕßÃǸøGPUÉÕÖÆ³ÌÐò£¬½øÐÐͼÏñ´¦Àí¡£GPUµÄ²¢ÐÐÁ÷´¦ÀíÄÜÁ¦ÎüÒýÁ˲¢ÐмÆËãµÄÑо¿Õߣ¬Ñо¿ÕßÃǽèÖúͼÐαà³ÌµÄ¸ÅÄ°Ñ¼ÆËã²Ù×÷ת»¯³ÉͼÐÎÎÆÀí²Ù×÷¡£Õâ¸öʱºòGPU¼ÆË㣬ÐèÒª¶ÔͼÐθÅÄîÓбȽÏÉîµÄÁ˽⣬±à³Ì±È½Ï¸´ÔÓ¡£µÚËÄ´úGPUÒÔNVIDIAµÄGeForceϵÁÐÏÔ¿¨Îª´ú±í£¬¿ªÊ¼ÌṩרÃÅÓÃÓÚͨÓüÆËãµÄ¼¼Êõ£¬²¢ÇÒ³öÏÖÁËCUDA[17]¡¢openCL[6]µÈ»ùÓÚcÓïÑÔµÄͨÓñà³ÌÓïÑÔ¡£GPUÓÃÓÚ²¢ÐмÆËãµÄ¼¼Êõ³ÆÎªGPGPU£¨general
purpose GPU£©[4]¡£GPGPUÉæ¼°µÄ·¶Î§ºÜ¹ã£¬°üÀ¨Á˼¸ºÎ¼ÆËã¡¢µ°°×ÖÊÄ£Äâ¡¢ÓÅ»¯¼ÆË㡢ƫ΢·Ö·½³ÌµÈ¡£
ĿǰµÄÏÔ¿¨Êг¡£¬Ö÷ÒªÓÐÁ½¼Ò¹«Ë¾µÄ²úÆ·£¬Ò»¸öÊÇNVIDIAÏÔ¿¨£¬ÁíÒ»¸öÊÇATIÏÔ¿¨¡£Í¨ÓüÆËãÓïÑÔÓÐÁ½¸ö±ê×¼£¬µÚÒ»¸öÊÇNVIDIA¹«Ë¾µÄCUDA¼¼Êõ£¬ÁíÒ»¸öÊÇÓÉapple¹«Ë¾Ìá³ö¡¢¶à¼Ò¹«Ë¾¹²Í¬¿ª·¢µÄ¿ª·Å±ê×¼openCL¡£CUDA¼¼ÊõÊÇNVIDIA¹«Ë¾µÄ˽Óбê×¼¡£ÓÉÓÚNVIDIA¹«Ë¾×îÏȳ¢ÊÔGPUͨÓüÆË㣬ÆäÑз¢µÄÓÃÓÚͨÓüÆËãµÄÏÔ¿¨ºÍÓÃÓÚͨÓüÆËãµÄ±à³ÌÓïÑÔCUDA×îÔç³öÏÖÔÚÊг¡ÉÏ¡£Òò´Ë£¬CUDA¼¼ÊõÏà¶ÔÓÚÆäËûµÄ¼¼Êõ¶øÑÔ£¬ÓµÓкÜÇ¿µÄÓÅÊÆ£¬¹ØÓÚCUDA¼¼ÊõµÄ×ÊÁϺÍÌÖÂÛÒ²±È½Ï¶à¡£¶øopenCLÊÇÒ»¸ö¿ª·Å±ê×¼£¬¶à¼Ò¹«Ë¾µÄ²úÆ·¶¼Ö§³Ö¸Ã±ê×¼£¬°üÀ¨NVIDIAÏÔ¿¨£¬»¹ÓÐATIÏÔ¿¨µÄstream¼¼ÊõÒ²Ö§³Ö¸Ã±ê×¼¡£ÓÉÓÚopenCL¿ª·¢µÄ±È½ÏÍí£¬ÔÚÆä¿ª·¢Ê±£¬CUDA¼¼ÊõÒѾºÜ³ÉÊìÁË£¬Òò´ËopenCLÔںܶà¸ÅÄîÉÏ½è¼øÁËCUDA¼¼Êõ¡£
GPUÓ²¼þ¼Ü¹¹
ÔÚGPU±à³ÌµÄÓ²¼þ½á¹¹ÖУ¬ÕûÌåÉ豸±»·ÖΪÁ½¸ö²¿·Ö¡£µÚÒ»¸ö²¿·ÖÊÇ¿ØÖÆÉ豸£¬³ÆÎªHost£¨Ö÷»ú£©¡£µÚ¶þ²¿·ÖÊǼÆËãÉ豸£¬³ÆÎªdevice¡£
Host ¸ºÔð¹ÜÀíGPUµÄÔËÐУ¬ÒÔ¼°×ÊÔ´µÄ·ÖÅä¹ÜÀí¡£×¼È·µÄ˵£¬Ñо¿ÕßÊÇͨ¹ýºÍHost½»Á÷£¬À´¿ØÖÆGPU¡£Hostͨ¹ýopenCL
api À´ºÍ¼ÆËãÉ豸½»»¥¡£HostÊÇÔËÐÐÓÚCPUÉϵġ£ÔËÐÐÓÚHostÉϵijÌÐò³ÆÎªhost program¡£
¼ÆËãÉ豸µÄÕûÌåÓÖ»®·ÖÁ˺ܶàµÄ¼ÆËãµ¥Ôª£¨compute Unit£©¡£Ã¿¸ö¼ÆËãµ¥ÔªÓÐһЩ¹²Ïí×ÊÔ´£¬Í¬Ò»¸ö¼ÆËãµ¥ÔªÄڵĴ¦ÀíÔª¿ÉÒÔʵÏÖͬ²½¡£Ã¿¸ö¼ÆËãµ¥ÔªÓÖ»®·Ö³ÉÈô¸É¸ö´¦ÀíÔª¡£ÕæÕýµÄ¼ÆËã·¢ÉúÔÚ´¦ÀíÔªÉÏ¡£ÔËÐÐÔÚÿ¸ö´¦ÀíÔªÉϵÄʵÀý³ÆÎªkernel¡£
¼ÙÉèÓÐN¸ö¼ÆËãµ¥Ôª£¬Ã¿¸ö¼ÆËãµ¥ÔªÓÐM¸ö´¦ÀíÔª¡£ÄÇô×ܹ²ÓÐN*M¸öºË¡£Í¬Ò»Ê±¿Ì£¬¾Í¿ÉÒÔÔÙÉ豸ÉÏÔËÐÐN*M¸öʵÀý¡£Òò´Ë£¬Èç¹û²»¿¼ÂÇI/OµÈÆäËûÒòËØ£¬¼ÓËٱȵÄÀíÂÛÉÏÏÞÊÇN*M¡£

ͼ 2-1 GPUÓ²¼þ³éÏóÄ£ÐÍ
GPUÈí¼þ¼Ü¹¹

ͼ2-2 OpenCL±à³ÌÄ£ÐÍ
openCL°ÑÕû¸ö¼ÆËãÉ豸µÄ¿Õ¼ä»®·Ö³ÉNά£¨N=1¡¢2¡¢3£©£¬³ÆÎªNDRange¡£Ã¿Ò»¸öά¶ÈÉϵÄÓÖ»®·Ö³ÉÈô¸É¸ö¹¤×÷×飨work
group£©£¬Ã¿¸ö¹¤×÷×éÓÖ°üº¬ÁËÈô¸É¸ö¹¤×÷µ¥Ôª£¨work item£©¡£ÔÚÿһ¸öά¶ÈÄÚ£¬Ã¿Ò»¸ö¹¤×÷×é¶¼ÓÐÒ»¸öΨһgroup
id±êʶ¡£Ã¿Ò»¸ö¹¤×÷µ¥Ôª¶¼ÓÐÒ»¸öΨһµÄglobal id¡£ÔÚÿһ¸öά¶ÈµÄÿһ¸ö¹¤×÷×éÄÚ£¬Ã¿¸ö¹¤×÷µ¥Ôª¶¼ÓÐÒ»¸öΨһµÄlocal
id±êʶ¡£Ã¿Ò»¸ö¹¤×÷µ¥ÔªµÄglobal id¿ÉÒÔºÍËùÊô¹¤×÷×éµÄgroup idºÍlocal id»»Ëã¡£
ºÍÉÏһС½ÚÏà±È£¬ÔÚÉÏһС½ÚÖÐÌáµ½µÄ¼ÆËãµ¥ÔªºÍ´¦ÀíÔªµÄ¸ÅÄî¶¼ÊÇÓ²¼þ¸ÅÄî¡£¶ø±¾Ð¡½ÚÌáµ½µÄά¶È¡¢¹¤×÷×é¡¢¹¤×÷µ¥ÔªµÄ¸ÅÄîÊdzéÏó¸ÅÄºÍÓ²¼þ¸ÅÄîÖ®¼äûÓйØÁª¡£Ã¿Ò»¸ö¹¤×÷µ¥Ôª£¬¿ÉÒÔÓÉÒ»¸ö»òÕß¶à¸ö´¦ÀíÔª¹¹³É¡£
ÿһ¸öά¶ÈÉϵÄÿ¸ö¹¤×÷×éµÄ´óСÓÐÒ»¶¨µÄÏÞÖÆ ,ËùÓÐά¶ÈÄÚÊôÓÚͬһ¸ö¹¤×÷×éµÄ¹¤×÷µ¥ÔªµÄÊýÄ¿²»Äܳ¬¹ýÓ²¼þÒ»¸ö¼ÆËã»úȺµÄ´óС¡£¼ÙÉèÿ¸öά¶ÈµÄ¹¤×÷×é´óС·Ö±ðÊÇN1£¬N2£¬N3£¬¼ÆËãµ¥ÔªµÄ´óСÊÇsize£¬ÄÇôÓÐN1*N2*N3<=size¡£
ͼ2-2ÖÐչʾµÄÊÇÒ»¸ö¶þά¿Õ¼ä¡£ÆäÐÎʽÀàËÆÓÚ¶þά¾ØÕó£¬Ö»ÊÇÿ¸öά¶ÈÉÏ»¹Óй¤×÷×éµÄ¸ÅÄî¡£
openCL´æ´¢Ä£ÐÍ
openCLµÄ´æ´¢¸ù¾Ý×÷ÓÃÓò¿ÉÒÔ·Ö³ÉËĸö¼¶±ð¡£ÒÀ´ÎÊÇ£ºÈ«¾ÖÄڴ棬³£Á¿Äڴ棬¾Ö²¿Äڴ棬˽ÓÐÄÚ´æ¡£
È«¾ÖÄڴ棬¶ÔÓÚËùÓй¤×÷×éÄÚµÄËùÓй¤×÷µ¥Ôª¶¼¿É¶ÁºÍ¿Éд¡£µ«ÊǶÔÕⲿ·ÖÄÚ´æµÄ¶Áд¿ÉÄܻᱻ»º´æ£¬Òò´Ë¶à¸ö´¦Àíµ¥Ôª´¦Àíͬһ¿éÄÚ´æÊ±£¬Òª×¢Òâ½øÐÐͬ²½¡£
³£Á¿Äڴ棬×÷ÓÃÓòºÍÈ«¾ÖÄÚ´æÒ»Ñù£¬µ«ÊÇÖ»¿É¶Á£¬²»¿Éд¡£È«¾ÖÄÚ´æºÍ³£Á¿ÄÚ´æ¶¼ÊÇÓÉhost½øÐзÖÅä¿Õ¼äºÍ³õʼ»¯µÄ¡£
¾Ö²¿Äڴ棬¹ËÃû˼Ò壬ֻ¶Ô²¿·Ö´¦Àíµ¥Ôª¿É²Ù×÷¡£Æä×÷ÓÃÓòÔÚͬһ¸ö¹¤×÷×éÄÚ¡£Õⲿ·ÖµÄÓ²¼þλÓÚ¼ÆËãµ¥ÔªÄÚ²¿¡£
˽ÓÐÄڴ棬½öÏÞÓÚµ¥¸ö¹¤×÷µ¥Ôª¿É¶Áд£¬ÆäÓ²¼þλÓÚ´¦Àíµ¥ÔªÄÚ²¿¡£Í¨³££¬ÔÚ¹¤×÷µ¥ÔªÉÏÔËÐеÄkernelʵÀý£¬Æäº¯Êý¾Ö²¿±äÁ¿ÊÇ·ÖÅäÔÚ˽ÓÐÄÚ´æÉϵġ£
openCLµÄÈ«¾ÖÄÚ´æÍ¨³£ÓÃÓÚ·ÅÖÃgpuµÄÈë¿Ú²ÎÊý£¬ÒÔ¼°GPUµÄÔËÐнá¹û¡£openCLµÄ³ÌÐò±¾ÉíÊDz»Ìṩ·µ»ØÖµµÄ£¬Òò´ËÈç¹ûÒª»ñµÃ·µ»ØÖµ£¬¾ÍÐèÒª°ÑÔËÐнá¹û·ÅÈëÈ«¾ÖÄÚ´æ¡£ÔÚ³ÌÐò½áÊøºó£¬ÓÉhost³ÌÐò¶Áȡȫ¾ÖÄÚ´æÇøµÄÊý¾Ý£¬´Ó¶ø»ñµÃ·µ»ØÖµ¡£
openCLµÄÖ´ÐÐÄ£ÐÍ
¶ÔÓÚopenCl¶øÑÔ£¬ÓÐÁ½ÖÖÀàÐ͵ÄÖ´Ðз½Ê½£¬µÚÒ»ÖÖÊÇÈÎÎñ²¢ÐÐÄ£ÐÍ£¬µÚ¶þÖÖÊÇÊý¾Ý²¢ÐÐÄ£ÐÍ¡£
ÈÎÎñ²¢ÐÐÄ£ÐÍÊÇÖ¸£¬Ã¿¸ö¹¤×÷µ¥ÔªÄÚ£¬ÔËÐÐÒ»¸ökernelʵÀý£¬µ«ÊDz»Í¬µÄµ¥ÔªÔËÐеÄʵÀý¿ÉÄܲ»Ò»Ñù¡£
Êý¾Ý²¢ÐÐÄ£ÐÍÊÇÖ¸£¬Ã¿¸ö¹¤×÷µ¥ÔªÄÚ£¬ÔËÐеÄÊÇͬһ¸ökernelʵÀý£¬Ö»ÊÇÿ¸öµ¥Ôª´¦ÀíµÄÊý¾Ý²»Ò»Ñù£¬ÓÉÓÚÿ¸öµ¥Ôª¶¼ÓÐÒ»¸öΨһµÄid±êʶ£¬ËùÒÔ£¬¿ÉÒÔͨ¹ýÕâ¸öidÀ´Ö¸¶¨Õâ¸öµ¥Ôª´¦ÀíµÄÊÇÄÄЩÊý¾Ý¡£
ÔÚÒÅ´«Ëã·¨µÄʵÏÖ·½Ê½ÖУ¬±¾ÎIJÉÈ¡ÁËÊý¾Ý²¢ÐÐÄ£ÐÍ¡£
ͬ²½
ÔÚÒÅ´«Ëã·¨ÖУ¬¶ÔÓÚÿһ´Îµü´ú£¬ÓÐЩ²Ù×÷ÐèÒªµÈ´ýËùÓеŤ×÷µ¥ÔªÍê³Éºó²ÅÄܽøÐС£±ÈÈ磬¶ÔÓÚ´«Í³ÒÅ´«Ëã·¨£¬ÔÚÑ¡Ôñ²Ù×÷ǰ£¬ÐèÒªËùÓеĸöÌåͬʱÍê³É¸öÌåÊÊÓ¦ÖµµÄÆÀ¼Û¡£Òò´ËÐèҪͬ²½²Ù×÷¡£
ÔÚopenCLÖУ¬´æÔÚÒ»¸öAPI£ºbarrier£¨cl_mem_fence_flag£©¡£±ê־λÓÐÁ½¸öÑ¡ÏLOCAL_MEM_FENCE
ºÍGLOBAL_MEM_FENCE£¬·Ö±ðÓÃÓÚͬ²½¾Ö²¿ÄÚ´æºÍÈ«¾ÖÄڴ档ͬ²½µÄ´¦Àíµ¥Ôª±ØÐëÔڵȴýËùÓеĴ¦Àíµ¥Ôª¶¼Ö´Ðе½¸Ãº¯Êýʱ£¬²ÅÄÜÖ´ÐÐÏÂÒ»ÌõÓï¾ä¡£
È»¶ø£¬ÕýÈçǰÎĽ²µ½µÄ£¬Ò»¸ö¹¤×÷×éµÄ´óСÊÇÓÐÏÞÖÆµÄ£¬Õâ¸öÏÞÖÆ¾ÍÊÇÒ»¸ö¼ÆËãµ¥ÔªµÄ´óС¡£¼ÆËãµ¥ÔªµÄ»®·ÖÊÇÓ²¼þÏÞÖÆ£¬ÊôÓÚͬһ¸ö¼ÆËãµ¥ÔªµÄ´¦Àíµ¥Ôª¹²Ïí¼ÆËãµ¥ÔªÄÚµÄÄÚ´æºÍÆäËû×ÊÔ´¡£GPU¶Ôͬ²½µÄʵÏÖÒ²ÒÀÀµÓÚÓ²¼þ£¬Òò´Ë£¬Ö»ÓÐÊôÓÚͬһ¸ö¼ÆËãµ¥ÔªµÄ´¦Àíµ¥Ôª²ÅÄܹ»ÊµÏÖͬ²½¡£¶ÔÓÚ³ÌÐò¿ª·¢Õß¶øÑÔ£¬openCLÈõ»¯ÁËÓ²¼þ¼Ü¹¹£¬¿ª·¢ÕßÖ»ÖªµÀ¹¤×÷×éÕâÒ»¸ÅÄ²»Çå³þ¼ÆËã»úȺÕâÒ»¸ÅÄî¡£Òò´Ë£¬openCLµÄͬ²½Ö»·¢ÉúÔÚͬһ¸ö¹¤×÷×éÖС£
ÔÚÒÅ´«Ëã·¨ÖУ¬Ëæ»ú¹ý³ÌÍùÍùÐèÒªºÜ´óµÄ»ùÊý²ÅÄܱ£Ö¤Ò»Ð©Ð¡¸ÅÂÊʼþµÄ·¢Éú¡£±ÈÈç±äÒì²Ù×÷£¬Õâ¸ö²Ù×÷µÄ¸ÅÂʺÜС£¬Èç¹ûÑù±¾ÊýÁ¿Ð¡µÄ»°£¬ºÜÄѱ£Ö¤»á·¢Éú±äÒì¡£µ«ÊÇ£¬Èç¹ûÑù±¾ÊýÁ¿³¬¹ýÁËÒ»¸ö¼ÆËãµ¥ÔªµÄ´óС£¬ÄÇô¾Í»áµ¼ÖÂͬ²½ÎÊÌâ¡£Òò´ËÔÚÕâÒ»µãÐèÒªÕÛÖп¼ÂÇ¡£Í¬Ò»¸öȺÌåµÄ¸öÌå¿ÉÒԷŵ½Í¬Ò»¸ö¼ÆËãµ¥ÔªÖÐÔËÐУ¬²»Í¬µÄȺÌå·Åµ½²»Í¬µÄ¼ÆËãµ¥ÔªÉÏ¡£ÖÖȺ¼äÎÞÐèͬ²½¡£ÕâÑù¼ÈÂú×ãÁËÑù±¾µÄÊýÁ¿ÐèÇó£¬Ò²Âú×ãÁËͬ²½ÒªÇó¡£
2.6. GPU³ÌÐòµÄÖ´ÐÐÁ÷³Ì
GPU³ÌÐò·ÖÁ½²¿·Ö£¬Ò»²¿·ÖÔÚCPUÉÏÖ´ÐУ¬Õⲿ·Ö³ÌÐò³ÆÎªhost program£¬Ò»²¿·ÖÔÚGPUÉÏÖ´ÐУ¬Õⲿ·Ö³ÌÐò³ÆÎªkernel
¡£Host ³ÌÐò¸ºÔð³õʼ»¯»·¾³£¬°üÀ¨GPUÔËÐл·¾³ºÍ²ÎÊý¡£KernelÔò¸ºÔð¼ÆË㣬²¢°Ñ¼ÆËã½á¹ûдÈëÄڴ棬ÓÉhost¶ÁÈ¡¡£ÍêÕûÁ÷³ÌÈçͼ2-3£º

ͼ2-3£º GPU³ÌÐòÍêÕûÔËÐÐÁ÷³Ì
±¾ÕÂС½á
±¾ÕÂÏêϸ½éÉÜÁËGPU±à³ÌÄ£ÐÍ£¬°üÀ¨GPUµÄÓ²¼þ¿ò¼Ü£¬½éÉÜÓ²¼þÏà¹ØµÄ±³¾°£»±à³ÌÄ£ÐͽéÉÜÈí¼þµÄ¿ò¼Ü£»´æ´¢Ä£Ðͽ²ÊöGPUµÄÄÚ´æÄ£ÐÍ£¬Ö´ÐÐÄ£Ðͽ²ÊöGPUµÄ±à³Ì¿ò¼Ü¡£´ËÍ⻹ÓÐÔÚGPUÖбà³ÌÐèҪעÒâµÄһЩÎÊÌ⣬±ÈÈçËæ»úÊý£¬Í¬²½ÎÊÌâ¡£×îºó½éÉÜÁËÒ»¸öÍêÕûµÄGPU²¢ÐгÌÐòµÄÁ÷³Ì¡£ |