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

主頁 > 知識庫 > 關于Python的GPU編程實例近鄰表計算的講解

關于Python的GPU編程實例近鄰表計算的講解

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

技術背景

GPU加速是現(xiàn)代工業(yè)各種場景中非常常用的一種技術,這得益于GPU計算的高度并行化。在Python中存在有多種GPU并行優(yōu)化的解決方案,包括之前的博客中提到的cupy、pycuda和numba.cuda,都是GPU加速的標志性Python庫。這里我們重點推numba.cuda這一解決方案,因為cupy的優(yōu)勢在于實現(xiàn)好了的眾多的函數,在算法實現(xiàn)的靈活性上還比較欠缺;而pycuda雖然提供了很好的靈活性和相當高的性能,但是這要求我們必須在Python的代碼中插入C代碼,這顯然是非常不Pythonic的解決方案。因此我們可以選擇numba.cuda這一解決方案,只要在Python函數前方加一個numba.cuda.jit的修飾器,就可以在Python中用最Python的編程語法,實現(xiàn)GPU的加速效果。

加速場景

我們需要先了解的是,GPU在什么樣的計算場景下能夠實現(xiàn)加速的效果,很顯然的是,并不是所有的計算過程都能在GPU上表現(xiàn)出加速的效果。前面說道,GPU的加速作用,是源自于高度的并行化,所謂的并行,就要求進程之前互不干擾或者依賴。如果說一個進程的計算過程或者結果,依賴于另一個進程中的計算結果,那么就無法實現(xiàn)完全的并行,只能使用串行的技術。這里為了展示GPU加速的效果,我們就引入一個在分子動力學模擬領域中常見的問題:近鄰表的計算。

近鄰表計算的問題是這樣描述的:給定一堆數量為n的原子系統(tǒng),每一個原子的三維坐標都是已知的,給定一個截斷常數d0,當兩個原子之間的距離di,j=d0時,則認為這兩個原子是相鄰近的原子。那么最終我們需要給出一個0-1矩陣Ai,j,當Ai,j=0時,表示i,j兩個原子互不相鄰,反之則相鄰。那么對于這個問題場景,我們就可以并行化的遍歷n×n的空間,直接輸出An×n大小的近鄰表。這個計算場景是一個非常適合用GPU來加速的計算,以下我們先看一下不用GPU加速時的常規(guī)實現(xiàn)方案:

# cuda_neighbor_list.py

from numba import jit
from numba import cuda
import numpy as np

@jit
def neighbor_list(crd, neighbors, data_length, cutoff):
    """CPU based neighbor list calculation.
    """
    for i in range(data_length):
        for j in range(i+1, data_length):
            if np.linalg.norm(crd[i]-crd[j]) = cutoff:
                neighbors[i][j] = 1
                neighbors[j][i] = 1
    return neighbors

if __name__ == '__main__':
    np.random.seed(1)
    atoms = 2**2
    cutoff = 0.5
    crd = np.random.random((atoms,3))
    adjacent = np.zeros((atoms, atoms))
    adjacent = neighbor_list(crd, adjacent, atoms, cutoff)
    print (adjacent)

這是最常規(guī)的一種CPU上的實現(xiàn)方案,遍歷所有的原子,計算原子間距,然后填充近鄰表。這里我們還使用到了numba.jit即時編譯的功能,這個功能是在執(zhí)行到相關函數時再對其進行編譯的方法,在矢量化的計算中有可能使用到芯片廠商所提供的SIMD的一些優(yōu)化。當然,這里都是CPU層面的執(zhí)行和優(yōu)化,執(zhí)行結果如下:

$ python3 cuda_neighbor_list.py
[[0. 0. 0. 0.]
[0. 0. 1. 0.]
[0. 1. 0. 1.]
[0. 0. 1. 0.]]

這個輸出的結果就是一個0-1近鄰表。

基于Numba的GPU加速

對于上述的近鄰表計算的場景,我們很容易的想到這個neighbor_list函數可以用GPU的函數來進行改造。對于每一個di,j我們都可以啟動一個線程去執(zhí)行計算,類似于CPU上的SIMD技術,GPU中的這項優(yōu)化稱為SIMT。而在Python中改造成GPU函數的方法也非常簡單,只需要把函數前的修飾器改一下,去掉函數內部的for循環(huán),就基本完成了,比如下面這個改造的近鄰表計算的案例:

# cuda_neighbor_list.py

from numba import jit
from numba import cuda
import numpy as np

@jit
def neighbor_list(crd, neighbors, data_length, cutoff):
    """CPU based neighbor list calculation.
    """
    for i in range(data_length):
        for j in range(i+1, data_length):
            if np.linalg.norm(crd[i]-crd[j]) = cutoff:
                neighbors[i][j] = 1
                neighbors[j][i] = 1
    return neighbors

@cuda.jit
def cuda_neighbor_list(crd, neighbors, cutoff):
    """GPU based neighbor list calculation.
    """
    i, j = cuda.grid(2)
    dis = ((crd[i][0]-crd[j][0])**2+\

           (crd[i][1]-crd[j][1])**2+\

           (crd[i][2]-crd[j][2])**2)**0.5
    neighbors[i][j] = dis = cutoff[0] and dis > 0

if __name__ == '__main__':
    import time
    np.random.seed(1)

    atoms = 2**5
    cutoff = 0.5
    cutoff_cuda = cuda.to_device(np.array([cutoff]).astype(np.float32))
    crd = np.random.random((atoms,3)).astype(np.float32)
    crd_cuda = cuda.to_device(crd)
    adjacent = np.zeros((atoms, atoms)).astype(np.float32)
    adjacent_cuda = cuda.to_device(adjacent)

    time0 = time.time()
    adjacent_c = neighbor_list(crd, adjacent, atoms, cutoff)
    time1 = time.time()
    cuda_neighbor_list[(atoms, atoms), (1, 1)](crd_cuda,
                                               adjacent_cuda,
                                               cutoff_cuda)
    time2 = time.time()
    adjacent_g = adjacent_cuda.copy_to_host()
    print ('The time cost of CPU with numba.jit is: {}s'.format(\

                                            time1-time0))
    print ('The time cost of GPU with cuda.jit is: {}s'.format(\

                                            time2-time1))
    print ('The result error is: {}'.format(np.sum(adjacent_c-\

                                            adjacent_g)))

需要說明的是,當前Numba并未支持所有的numpy的函數,因此有一些計算的功能需要我們自己去手動實現(xiàn)一下,比如計算一個Norm的值。這里我們在輸出結果中不僅統(tǒng)計了結果的正確性,也給出了運行的時間:

$ python3 cuda_neighbor_list.py
The time cost of CPU with numba.jit is: 0.6401469707489014s
The time cost of GPU with cuda.jit is: 0.19208502769470215s
The result error is: 0.0

需要說明的是,這里僅僅運行了一次的程序,而jit即時編譯的加速效果在第一次的運行中其實并不明顯,甚至還有一些速度偏慢,但是在后續(xù)過程的函數調用中,就能夠起到比較大的加速效果。所以這里的運行時間并沒有太大的代表性,比較有代表性的時間對比可以看如下的案例:

# cuda_neighbor_list.py

from numba import jit
from numba import cuda
import numpy as np

@jit
def neighbor_list(crd, neighbors, data_length, cutoff):
    """CPU based neighbor list calculation.
    """
    for i in range(data_length):
        for j in range(i+1, data_length):
            if np.linalg.norm(crd[i]-crd[j]) = cutoff:
                neighbors[i][j] = 1
                neighbors[j][i] = 1
    return neighbors

@cuda.jit
def cuda_neighbor_list(crd, neighbors, cutoff):
    """GPU based neighbor list calculation.
    """
    i, j = cuda.grid(2)
    dis = ((crd[i][0]-crd[j][0])**2+\

           (crd[i][1]-crd[j][1])**2+\

           (crd[i][2]-crd[j][2])**2)**0.5
    neighbors[i][j] = dis = cutoff[0] and dis > 0

if __name__ == '__main__':
    import time
    np.random.seed(1)

    atoms = 2**10
    cutoff = 0.5
    cutoff_cuda = cuda.to_device(np.array([cutoff]).astype(np.float32))
    crd = np.random.random((atoms,3)).astype(np.float32)
    crd_cuda = cuda.to_device(crd)
    adjacent = np.zeros((atoms, atoms)).astype(np.float32)
    adjacent_cuda = cuda.to_device(adjacent)
    time_c = 0.0
    time_g = 0.0

    for _ in range(100):
        time0 = time.time()
        adjacent_c = neighbor_list(crd, adjacent, atoms, cutoff)
        time1 = time.time()
        cuda_neighbor_list[(atoms, atoms), (1, 1)](crd_cuda,
                                                adjacent_cuda,
                                                cutoff_cuda)
        time2 = time.time()
        if _ != 0:
            time_c += time1 - time0
            time_g += time2 - time1
    
    print ('The total time cost of CPU with numba.jit is: {}s'.format(\

                                            time_c))
    print ('The total time cost of GPU with cuda.jit is: {}s'.format(\

                                            time_g))

這個案例中也沒有修改較多的地方,只是把一次計算的時間調整為多次計算的時間,并且忽略第一次計算過程中的即時編譯,最終輸出結果如下:

$ python3 cuda_neighbor_list.py
The total time cost of CPU with numba.jit is: 14.955506563186646s
The total time cost of GPU with cuda.jit is: 0.018685102462768555s

可以看到,在GPU加速后,相比于CPU的高性能運算,能夠提速達將近1000倍!

總結概要

對于Pythoner而言,苦其性能已久。如果能夠用一種非常Pythonic的方法來實現(xiàn)GPU的加速效果,對于Pythoner而言無疑是巨大的好消息,Numba就為我們提供了這樣的一個基礎功能。本文通過一個近鄰表計算的案例,給出了適用于GPU加速的計算場景。這種計算場景可并行化的程度較高,而且函數會被多次用到(在分子動力學模擬的過程中,每一個step都會調用到這個函數),因此這是一種最典型的、最適用于GPU加速場景的案例。

以上就是關于Python的GPU編程實例近鄰表計算的講解的詳細內容,更多關于Python GPU編程實例的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 詳解python中GPU版本的opencv常用方法介紹
  • 運行tensorflow python程序,限制對GPU和CPU的占用操作

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

巨人網絡通訊聲明:本文標題《關于Python的GPU編程實例近鄰表計算的講解》,本文關鍵詞  關于,Python,的,GPU,編程,實例,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《關于Python的GPU編程實例近鄰表計算的講解》相關的同類信息!
  • 本頁收集關于關于Python的GPU編程實例近鄰表計算的講解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    26uuu另类欧美亚洲曰本| 日韩欧美一区中文| 极品瑜伽女神91| 看电视剧不卡顿的网站| 亚洲国产日韩精品| 视频一区二区中文字幕| 一区二区三区四区五区视频在线观看 | 亚洲天堂网中文字| 中文字幕色av一区二区三区| 国产精品久久久久久久久果冻传媒 | 国产一区二区三区| 日本v片在线高清不卡在线观看| 亚洲第一精品在线| 狠狠色狠狠色合久久伊人| 国产曰批免费观看久久久| thepron国产精品| 欧美日韩小视频| 国产女主播视频一区二区| 综合亚洲深深色噜噜狠狠网站| 欧美成人激情免费网| 欧美三区在线视频| 久久精品夜色噜噜亚洲aⅴ| 欧美精品一区二区蜜臀亚洲| 中文字幕免费不卡| 麻豆成人综合网| 成人爱爱电影网址| 欧美一二三四区在线| ●精品国产综合乱码久久久久| 日韩高清中文字幕一区| aaa欧美色吧激情视频| 久久美女高清视频| 日本成人中文字幕| 欧美日韩亚洲综合在线| 国产精品美女久久久久久久| 国产精品亚洲视频| 亚洲国产婷婷综合在线精品| 国产日韩精品久久久| 图片区日韩欧美亚洲| 欧美精选一区二区| 激情都市一区二区| 日韩亚洲欧美中文三级| 香蕉久久一区二区不卡无毒影院 | 美女网站色91| 欧美日韩高清一区| 亚洲日本在线a| 欧美三片在线视频观看| 亚洲欧美另类图片小说| 在线这里只有精品| 亚洲成人免费电影| 日韩欧美视频在线| 国产999精品久久| 亚洲一二三区不卡| 精品欧美久久久| 91视频免费播放| 奇米精品一区二区三区四区 | 亚洲精品日日夜夜| 欧美一区二区黄| gogo大胆日本视频一区| 午夜久久久久久久久久一区二区| 欧美区在线观看| 成人美女在线观看| 亚洲第一福利一区| 亚洲美女在线国产| 日韩一区二区在线观看视频播放| 99精品一区二区| 国产·精品毛片| 美女视频黄 久久| 一区二区国产盗摄色噜噜| 国产精品久久久久国产精品日日| 欧美日韩在线观看一区二区 | 国产亚洲欧美激情| 26uuu国产日韩综合| 91精品国产日韩91久久久久久| 99国产麻豆精品| 成人网男人的天堂| 91原创在线视频| 成人激情开心网| 中文字幕乱码一区二区免费| 日韩一区国产二区欧美三区| 美洲天堂一区二卡三卡四卡视频| 亚洲人成在线观看一区二区| 日本道在线观看一区二区| 99久久精品费精品国产一区二区 | 欧美精品一区二区三| 在线一区二区三区四区五区 | 亚洲视频一区在线观看| 欧美巨大另类极品videosbest| 国产不卡视频在线观看| 国产69精品一区二区亚洲孕妇 | 精品国产91久久久久久久妲己| 激情六月婷婷久久| 韩国av一区二区| 美女在线一区二区| 免费高清在线一区| 蜜桃视频免费观看一区| 精品一区二区三区免费毛片爱| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 欧美成人国产一区二区| 欧美日韩一二区| 欧美成人性战久久| 国产精品每日更新| 日韩经典中文字幕一区| 国产一区二区视频在线播放| 国产精华液一区二区三区| 蜜臀av一区二区在线免费观看 | 高清视频一区二区| a在线欧美一区| 欧美一区二区三区免费视频| 久久综合久色欧美综合狠狠| 国产精品日日摸夜夜摸av| 日韩av电影免费观看高清完整版在线观看 | av男人天堂一区| 26uuu亚洲婷婷狠狠天堂| 亚洲www啪成人一区二区麻豆| 国产久卡久卡久卡久卡视频精品| 一本大道久久a久久精二百| 国产日韩欧美综合一区| 日韩av在线发布| 欧美性受极品xxxx喷水| 国产精品国产三级国产三级人妇| 国产一区二区三区不卡在线观看| av欧美精品.com| 一区二区在线电影| 99这里只有精品| 一区二区三区成人| 欧美最猛黑人xxxxx猛交| 中文字幕欧美日本乱码一线二线| 国产一区在线观看视频| 日韩一二在线观看| 久久国产福利国产秒拍| 欧洲一区在线观看| 午夜天堂影视香蕉久久| 日韩免费一区二区| 精品一区二区三区日韩| 国产精品福利一区二区| 99国产精品久久久久久久久久久 | 亚洲精品写真福利| 欧美一区2区视频在线观看| 日本少妇一区二区| 欧美一区二区三区日韩| 亚洲成人免费视| 国产欧美日韩在线| 99精品欧美一区二区三区综合在线| 国产精品久久久久久户外露出 | 国产a区久久久| 亚洲一区二区三区中文字幕 | 日本一二三四高清不卡| 欧美性一级生活| 粉嫩av一区二区三区在线播放| 91精品国产免费| www.欧美日韩| 国产乱人伦精品一区二区在线观看| 国产精品私人自拍| www国产亚洲精品久久麻豆| 91成人免费网站| 99视频在线精品| 国产成人精品三级麻豆| 久久精品国产免费| 美女精品自拍一二三四| 午夜欧美电影在线观看| 亚洲成人在线观看视频| 国产日韩欧美高清在线| 久久蜜桃一区二区| 欧美一区二视频| 黄色精品一二区| 国产一本一道久久香蕉| 蜜桃久久精品一区二区| 日日夜夜免费精品| 亚洲成a人片在线不卡一二三区| 国产精品久久久久桃色tv| 亚洲美女在线一区| 国产亚洲人成网站| 中文字幕一区二区三区色视频| 欧美日韩激情在线| 精品国产麻豆免费人成网站| 中文在线一区二区| 日韩专区中文字幕一区二区| 精品一区二区三区视频| 免费观看一级特黄欧美大片| 韩国在线一区二区| av电影天堂一区二区在线| 91官网在线观看| 亚洲国产精品av| 天天综合网天天综合色| 老司机精品视频导航| 欧美日韩一区久久| 国产精品成人一区二区三区夜夜夜| 亚洲免费观看高清完整版在线观看 | 亚洲欧美影音先锋| 《视频一区视频二区| 国产精品91一区二区| 欧美欧美午夜aⅴ在线观看| 欧美精品一区二区不卡| 亚洲国产精品一区二区www| 日本v片在线高清不卡在线观看| 色综合天天性综合| 国产精品护士白丝一区av| 日精品一区二区三区| 欧美欧美欧美欧美| 精品一区二区三区在线视频|