电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python實現GPU加速的基本操作

瀏覽:40日期:2022-08-07 08:33:11
目錄CUDA的線程與塊用GPU打印線程編號用GPU打印塊編號用GPU打印塊的維度用GPU打印線程的維度總結GPU所支持的最大并行度GPU的加速效果總結概要CUDA的線程與塊

GPU從計算邏輯來講,可以認為是一個高并行度的計算陣列,我們可以想象成一個二維的像圍棋棋盤一樣的網格,每一個格子都可以執行一個單獨的任務,并且所有的格子可以同時執行計算任務,這就是GPU加速的來源。那么剛才所提到的棋盤,每一列都認為是一個線程,并有自己的線程編號;每一行都是一個塊,有自己的塊編號。我們可以通過一些簡單的程序來理解這其中的邏輯:

用GPU打印線程編號

# numba_cuda_test.pyfrom numba import cuda@cuda.jitdef gpu(): print (’threadIdx:’, cuda.threadIdx.x)if __name__ == ’__main__’: gpu[2,4]()

threadIdx: 0threadIdx: 1threadIdx: 2threadIdx: 3threadIdx: 0threadIdx: 1threadIdx: 2threadIdx: 3用GPU打印塊編號

# numba_cuda_test.pyfrom numba import cuda@cuda.jitdef gpu(): print (’blockIdx:’, cuda.blockIdx.x)if __name__ == ’__main__’: gpu[2,4]()

blockIdx: 0blockIdx: 0blockIdx: 0blockIdx: 0blockIdx: 1blockIdx: 1blockIdx: 1blockIdx: 1用GPU打印塊的維度

# numba_cuda_test.pyfrom numba import cuda@cuda.jitdef gpu(): print (’blockDim:’, cuda.blockDim.x)if __name__ == ’__main__’: gpu[2,4]()

blockDim: 4blockDim: 4blockDim: 4blockDim: 4blockDim: 4blockDim: 4blockDim: 4blockDim: 4用GPU打印線程的維度

# numba_cuda_test.pyfrom numba import cuda@cuda.jitdef gpu(): print (’gridDim:’, cuda.gridDim.x)if __name__ == ’__main__’: gpu[2,4]()

gridDim: 2gridDim: 2gridDim: 2gridDim: 2gridDim: 2gridDim: 2gridDim: 2gridDim: 2總結

我們可以用如下的一張圖來總結剛才提到的GPU網格的概念,在上面的測試案例中,我們在GPU上劃分一塊2*4大小的陣列用于我們自己的計算,每一行都是一個塊,每一列都是一個線程,所有的網格是同時執行計算的內容的(如果沒有邏輯上的依賴的話)。

Python實現GPU加速的基本操作

GPU所支持的最大并行度

我們可以用幾個簡單的程序來測試一下GPU的并行度,因為每一個GPU上的網格都可以獨立的執行一個任務,因此我們認為可以分配多少個網格,就有多大的并行度。本機的最大并行應該是在(2^40),因此假設我們給GPU分配(2^50)大小的網格,程序就會報錯:

# numba_cuda_test.pyfrom numba import cuda@cuda.jitdef gpu(): passif __name__ == ’__main__’: gpu[2**50,1]() print (’Running Success!’)

運行結果如下:

Traceback (most recent call last):File 'numba_cuda_test.py', line 10, in <module>gpu[2**50,1]()File '/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/compiler.py', line 822, in __call__self.stream, self.sharedmem)File '/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/compiler.py', line 966, in callkernel.launch(args, griddim, blockdim, stream, sharedmem)File '/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/compiler.py', line 699, in launchcooperative=self.cooperative)File '/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/cudadrv/driver.py', line 2100, in launch_kernelNone)File '/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/cudadrv/driver.py', line 300, in safe_cuda_api_callself._check_error(fname, retcode)File '/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/cudadrv/driver.py', line 335, in _check_errorraise CudaAPIError(retcode, msg)numba.cuda.cudadrv.driver.CudaAPIError: [1] Call to cuLaunchKernel results in CUDA_ERROR_INVALID_VALUE

而如果我們分配一個額定大小之內的網格,程序就可以正常的運行:

# numba_cuda_test.pyfrom numba import cuda@cuda.jitdef gpu(): passif __name__ == ’__main__’: gpu[2**30,1]() print (’Running Success!’)

這里加了一個打印輸出:

Running Success!

需要注意的是,兩個維度上的可分配大小是不一致的,比如本機的上限是分配230*210大小的空間用于計算:

# numba_cuda_test.pyfrom numba import cuda@cuda.jitdef gpu(): passif __name__ == ’__main__’: gpu[2**30,2**10]() print (’Running Success!’)

同樣的,只要在允許的范圍內都是可以執行成功的:

Running Success!

如果在本機上有多塊GPU的話,還可以通過select_device的指令來選擇執行指令的GPU編號:

# numba_cuda_test.pyfrom numba import cudacuda.select_device(1)import time@cuda.jitdef gpu(): passif __name__ == ’__main__’: gpu[2**30,2**10]() print (’Running Success!’)

如果兩塊GPU的可分配空間一致的話,就可以運行成功:

Running Success!

GPU的加速效果

前面我們經常提到一個詞叫GPU加速,GPU之所以能夠實現加速的效果,正源自于GPU本身的高度并行性。這里我們直接用一個數組求和的案例來說明GPU的加速效果,這個案例需要得到的結果是(b_j=a_j+b_j),將求和后的值賦值在其中的一個輸入數組之上,以節省一些內存空間。當然,如果這個數組還有其他的用途的話,是不能這樣操作的。具體代碼如下:

# gpu_add.pyfrom numba import cudacuda.select_device(1)import numpy as npimport time@cuda.jitdef gpu(a,b,DATA_LENGHTH): idx = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x if idx < DATA_LENGHTH:b[idx] += a[idx]if __name__ == ’__main__’: np.random.seed(1) DATA_EXP_LENGTH = 20 DATA_DIMENSION = 2**DATA_EXP_LENGTH np_time = 0.0 nb_time = 0.0 for i in range(100):a = np.random.randn(DATA_DIMENSION).astype(np.float32)b = np.random.randn(DATA_DIMENSION).astype(np.float32)a_cuda = cuda.to_device(a)b_cuda = cuda.to_device(b)time0 = time.time()gpu[DATA_DIMENSION,4](a_cuda,b_cuda,DATA_DIMENSION)time1 = time.time()c = b_cuda.copy_to_host()time2 = time.time()d = np.add(a,b)time3 = time.time()if i == 0: print (’The error between numba and numpy is: ’, sum(c-d)) continuenp_time += time3 - time2nb_time += time1 - time0 print (’The time cost of numba is: {}s’.format(nb_time)) print (’The time cost of numpy is: {}s’.format(np_time))

需要注意的是,基于Numba實現的Python的GPU加速程序,采用的jit即時編譯的模式,也就是說,在運行調用到相關函數時,才會對其進行編譯優化。換句話說,第一次執行這一條指令的時候,事實上達不到加速的效果,因為這個運行的時間包含了較長的一段編譯時間。但是從第二次運行調用開始,就不需要重新編譯,這時候GPU加速的效果就體現出來了,運行結果如下:

$ python3 gpu_add.py The error between numba and numpy is: 0.0The time cost of numba is: 0.018711328506469727sThe time cost of numpy is: 0.09502553939819336s

可以看到,即使是相比于Python中優化程度十分強大的的Numpy實現,我們自己寫的GPU加速的程序也能夠達到5倍的加速效果(在前面一篇博客中,針對于特殊計算場景,加速效果可達1000倍以上),而且可定制化程度非常之高。

總結概要

本文針對于Python中使用Numba的GPU加速程序的一些基本概念和實現的方法,比如GPU中的線程和模塊的概念,以及給出了一個矢量加法的代碼案例,進一步說明了GPU加速的效果。需要注意的是,由于Python中的Numba實現是一種即時編譯的技術,因此第一次運算時的時間會明顯較長,所以我們一般說GPU加速是指從第二步開始的運行時間。對于一些工業和學界常見的場景,比如分子動力學模擬中的系統演化,或者是深度學習與量子計算中的參數優化,都是相同維度參數多步運算的一個過程,非常適合使用即時編譯的技術,配合以GPU高度并行化的加速效果,能夠在實際工業和學術界的各種場景下發揮巨大的作用。

到此這篇關于Python實現GPU加速的基本操作的文章就介紹到這了,更多相關Python GPU加速內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 不锈钢列管式冷凝器,换热器厂家-无锡飞尔诺环境工程有限公司 | 喷漆房_废气处理设备-湖北天地鑫环保设备有限公司 | 浙江皓格药业有限公司| 郑州宣传片拍摄-TVC广告片拍摄-微电影短视频制作-河南优柿文化传媒有限公司 | 智慧农业|农业物联网|现代农业物联网-托普云农物联网官方网站 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 建大仁科-温湿度变送器|温湿度传感器|温湿度记录仪_厂家_价格-山东仁科 | 板式换热器_板式换热器价格_管式换热器厂家-青岛康景辉 | 国产离子色谱仪,红外分光测油仪,自动烟尘烟气测试仪-青岛埃仑通用科技有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 臻知网大型互动问答社区-你的问题将在这里得到解答!-无锡据风网络科技有限公司 | 餐饮加盟网_特色餐饮连锁加盟店-餐饮加盟官网 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 送料机_高速冲床送料机_NC伺服滚轮送料机厂家-东莞市久谐自动化设备有限公司 | 手持式3d激光扫描仪-便携式三维立体扫描仪-北京福禄克斯 | 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 智慧养老_居家养老_社区养老_杰佳通 | 环氧树脂地坪_防静电地坪漆_环氧地坪漆涂料厂家-地壹涂料地坪漆 环球电气之家-中国专业电气电子产品行业服务网站! | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | wika威卡压力表-wika压力变送器-德国wika代理-威卡总代-北京博朗宁科技 | 双段式高压鼓风机-雕刻机用真空泵-绍兴天晨机械有限公司 | 刮板输送机,粉尘加湿搅拌机,螺旋输送机,布袋除尘器 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 华东师范大学在职研究生招生网_在职研究生招生联展网 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 客服外包专业服务商_客服外包中心_网萌科技 | 湖南成人高考报名-湖南成考网 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 【官网】博莱特空压机,永磁变频空压机,螺杆空压机-欧能优 | 风信子发稿-专注为企业提供全球新闻稿发布服务 | 威海防火彩钢板,威海岩棉复合板,威海彩钢瓦-文登区九龙岩棉复合板厂 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 |