婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Python實現GPU加速的基本操作

Python實現GPU加速的基本操作

熱門標簽:地圖標注多個 萊蕪電信外呼系統 沈陽防封電銷電話卡 銀川電話機器人電話 B52系統電梯外呼顯示E7 企業微信地圖標注 高德地圖標注收入咋樣 鶴壁手機自動外呼系統違法嗎 怎么辦理400客服電話

CUDA的線程與塊

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

用GPU打印線程編號

# numba_cuda_test.py

from numba import cuda

@cuda.jit
def gpu():
    print ('threadIdx:', cuda.threadIdx.x)

if __name__ == '__main__':
    gpu[2,4]()
threadIdx: 0
threadIdx: 1
threadIdx: 2
threadIdx: 3
threadIdx: 0
threadIdx: 1
threadIdx: 2
threadIdx: 3

用GPU打印塊編號

# numba_cuda_test.py

from numba import cuda

@cuda.jit
def gpu():
    print ('blockIdx:', cuda.blockIdx.x)

if __name__ == '__main__':
    gpu[2,4]()
blockIdx: 0
blockIdx: 0
blockIdx: 0
blockIdx: 0
blockIdx: 1
blockIdx: 1
blockIdx: 1
blockIdx: 1

用GPU打印塊的維度

# numba_cuda_test.py

from numba import cuda

@cuda.jit
def gpu():
    print ('blockDim:', cuda.blockDim.x)

if __name__ == '__main__':
    gpu[2,4]()
blockDim: 4
blockDim: 4
blockDim: 4
blockDim: 4
blockDim: 4
blockDim: 4
blockDim: 4
blockDim: 4

用GPU打印線程的維度

# numba_cuda_test.py

from numba import cuda

@cuda.jit
def gpu():
    print ('gridDim:', cuda.gridDim.x)

if __name__ == '__main__':
    gpu[2,4]()
gridDim: 2
gridDim: 2
gridDim: 2
gridDim: 2
gridDim: 2
gridDim: 2
gridDim: 2
gridDim: 2

總結

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

GPU所支持的最大并行度

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

# numba_cuda_test.py

from numba import cuda

@cuda.jit
def gpu():
    pass

if __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 call
kernel.launch(args, griddim, blockdim, stream, sharedmem)
File "/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/compiler.py", line 699, in launch
cooperative=self.cooperative)
File "/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/cudadrv/driver.py", line 2100, in launch_kernel
None)
File "/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/cudadrv/driver.py", line 300, in safe_cuda_api_call
self._check_error(fname, retcode)
File "/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/cudadrv/driver.py", line 335, in _check_error
raise CudaAPIError(retcode, msg)
numba.cuda.cudadrv.driver.CudaAPIError: [1] Call to cuLaunchKernel results in CUDA_ERROR_INVALID_VALUE

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

# numba_cuda_test.py

from numba import cuda

@cuda.jit
def gpu():
    pass

if __name__ == '__main__':
    gpu[2**30,1]()
    print ('Running Success!')

這里加了一個打印輸出:

Running Success!

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

# numba_cuda_test.py

from numba import cuda

@cuda.jit
def gpu():
    pass

if __name__ == '__main__':
    gpu[2**30,2**10]()
    print ('Running Success!')

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

Running Success!

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

# numba_cuda_test.py

from numba import cuda
cuda.select_device(1)
import time

@cuda.jit
def gpu():
    pass

if __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.py

from numba import cuda
cuda.select_device(1)
import numpy as np
import time

@cuda.jit
def 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))
            continue
        np_time += time3 - time2
        nb_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.0
The time cost of numba is: 0.018711328506469727s
The 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基于pyCUDA實現GPU加速并行計算功能入門教程

標簽:烏魯木齊 銀川 呼倫貝爾 安慶 呼倫貝爾 湘西 葫蘆島 三亞

巨人網絡通訊聲明:本文標題《Python實現GPU加速的基本操作》,本文關鍵詞  Python,實現,GPU,加速,的,基本操作,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python實現GPU加速的基本操作》相關的同類信息!
  • 本頁收集關于Python實現GPU加速的基本操作的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    奇米一区二区三区av| 亚洲品质自拍视频网站| 一区二区免费视频| 日本道精品一区二区三区| 欧美老肥妇做.爰bbww视频| 精品中文字幕一区二区小辣椒| 欧美裸体bbwbbwbbw| 国产精品网友自拍| 色综合久久综合中文综合网| 欧美成人三级在线| 欧美激情一区二区在线| 亚洲18色成人| 久久综合色8888| 菠萝蜜视频在线观看一区| 久久97超碰色| 亚洲一区二区三区美女| 欧美电视剧在线观看完整版| 一本久久精品一区二区| 一区二区三区精密机械公司| 综合在线观看色| 国产精品三级在线观看| 久久综合九色综合97婷婷| 制服丝袜成人动漫| 久久久午夜电影| 91麻豆精品国产| 欧美日韩国产一二三| 99久久精品久久久久久清纯| 国产一区 二区| 久久电影网电视剧免费观看| 日韩国产一二三区| 免费人成精品欧美精品| 午夜精品福利一区二区三区蜜桃| 亚洲柠檬福利资源导航| 亚洲成人先锋电影| 欧美大度的电影原声| 亚洲婷婷综合久久一本伊一区 | 91精品国产综合久久久久久漫画| 91在线视频18| 欧美人与性动xxxx| 欧美日韩一区二区电影| 精品国产一二三区| 亚洲天堂免费在线观看视频| 日本不卡免费在线视频| 丁香另类激情小说| 91精品午夜视频| 欧美艳星brazzers| 久久久国产精华| 亚洲一区在线观看视频| 日韩av电影一区| 成人激情视频网站| 欧美xxxx在线观看| 蜜臀久久99精品久久久久久9 | 一区二区三区四区精品在线视频| 国产精品无圣光一区二区| 亚洲高清免费在线| 色婷婷av久久久久久久| 久久久久久亚洲综合| 亚洲成人综合视频| 日韩免费观看高清完整版| 三级欧美在线一区| 欧美日韩中文另类| 亚洲成人在线网站| 欧美色精品在线视频| 久久99在线观看| 久久色在线视频| 黄页视频在线91| 26uuu欧美日本| 国产高清在线精品| 久久久久97国产精华液好用吗| 五月天激情综合| 91福利视频网站| 亚洲九九爱视频| 色噜噜狠狠成人网p站| 亚洲欧美日韩在线| 欧美日韩成人一区二区| 青娱乐精品在线视频| 精品免费视频一区二区| 日韩毛片精品高清免费| 欧美日韩视频专区在线播放| 国产黄色成人av| 亚洲妇女屁股眼交7| 91精品麻豆日日躁夜夜躁| 激情综合色综合久久| 日韩视频国产视频| 欧美精品日韩一区| 日韩精品色哟哟| 久久久av毛片精品| 欧美自拍偷拍一区| 蜜桃视频一区二区三区| 亚洲国产美女搞黄色| 欧美日韩国产高清一区二区| 久久精品国产成人一区二区三区| 国产欧美精品一区| 在线播放91灌醉迷j高跟美女| 一区二区三区在线视频观看| 久久精品视频一区| 日韩限制级电影在线观看| 色综合久久综合网97色综合| 日韩一区二区高清| 欧美日韩久久一区二区| 成人av在线资源| 粉嫩av亚洲一区二区图片| 亚欧色一区w666天堂| 中文字幕亚洲精品在线观看| 精品久久久久一区| 久久先锋影音av| 欧美一级搡bbbb搡bbbb| 另类的小说在线视频另类成人小视频在线 | 国产亚洲成aⅴ人片在线观看| 欧美一级理论片| 欧美一级黄色大片| 精品国产制服丝袜高跟| 国产精品久久久久久福利一牛影视| 中文一区二区完整视频在线观看| 午夜欧美电影在线观看| 日本vs亚洲vs韩国一区三区二区| 久久不见久久见免费视频7| 成人性生交大片免费| 91麻豆国产在线观看| 欧美一区二区不卡视频| 久久久久久久久一| 天使萌一区二区三区免费观看| 成人福利在线看| 日韩三级精品电影久久久| 日本一区二区动态图| 免费一级欧美片在线观看| 538在线一区二区精品国产| 亚洲成在人线在线播放| 国产精品久久久久一区二区三区| 7777精品伊人久久久大香线蕉最新版| 亚洲综合一二区| 亚洲欧美激情插| 成人黄页在线观看| 精品福利一二区| 国产成人综合视频| 亚洲欧美另类在线| 亚洲图片激情小说| 在线观看国产91| 久久97超碰国产精品超碰| 日韩一区二区三区免费看| 亚洲成人av电影| 69堂精品视频| 在线观看91精品国产入口| 亚洲成人动漫一区| 亚洲欧洲日韩女同| 欧美欧美午夜aⅴ在线观看| 天堂一区二区在线| 久久久无码精品亚洲日韩按摩| 国产99一区视频免费| 高清不卡一区二区在线| 欧美日韩aaaaaa| 成人的网站免费观看| 国产69精品久久久久777| 国产精品一区二区在线看| 美女被吸乳得到大胸91| 亚洲国产日韩综合久久精品| 精品一区二区在线视频| 久久九九久久九九| 91丨九色丨尤物| ...av二区三区久久精品| 97se亚洲国产综合自在线观| 国产精品卡一卡二卡三| 蜜桃久久久久久久| 欧美大片日本大片免费观看| 蜜桃精品视频在线| 日韩—二三区免费观看av| 亚洲另类在线一区| 国产成人av影院| 欧美另类一区二区三区| 正在播放一区二区| 久久综合狠狠综合久久综合88| 亚洲成人久久影院| 国内久久精品视频| 91麻豆精品国产91久久久久 | 日韩一级成人av| 欧美日韩国产高清一区| 免费成人你懂的| 亚洲国产综合色| 777奇米成人网| 成人午夜又粗又硬又大| 国产精品影音先锋| 久久不见久久见中文字幕免费| 日韩成人午夜精品| 亚洲午夜久久久久久久久电影网 | 又紧又大又爽精品一区二区| 日韩精品一二三区| 国产精品亲子伦对白| 亚洲综合在线免费观看| 麻豆一区二区99久久久久| 免费成人av在线| 欧美日韩免费在线视频| 色婷婷久久久久swag精品| 免费成人在线观看| 久久亚洲一级片| 日韩精品中午字幕| 视频精品一区二区| 久久久久97国产精华液好用吗| 一本一道久久a久久精品综合蜜臀| 日本在线不卡一区| 亚洲图片欧美色图|