0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

面向數(shù)組計算任務(wù)而設(shè)計的Numba具有CUDA加速功能

星星科技指導(dǎo)員 ? 來源:NVIDIA ? 作者:Mark Harris ? 2022-04-11 09:58 ? 次閱讀

Python 是一種高效的動態(tài)編程語言,廣泛應(yīng)用于科學(xué)、工程和數(shù)據(jù)分析應(yīng)用程序中。影響 python 流行的因素有很多,包括它簡潔而富有表現(xiàn)力的語法和標(biāo)準(zhǔn)的數(shù)據(jù)結(jié)構(gòu)、全面的“包含電池”的標(biāo)準(zhǔn)庫、優(yōu)秀的文檔、廣泛的庫和工具生態(tài)系統(tǒng)、專業(yè)支持的可用性以及大而開放的社區(qū)。不過,最重要的也許是 Python 這樣的動態(tài)類型化、解釋性語言所能實現(xiàn)的高生產(chǎn)率。 Python 既靈活又靈活,這使它成為快速原型設(shè)計和構(gòu)建完整系統(tǒng)的優(yōu)秀語言。

但是 Python 最大的優(yōu)點也可能是它最大的弱點:它的靈活性和無類型的高級語法會導(dǎo)致數(shù)據(jù)和計算密集型程序的性能下降。因此,關(guān)心效率的 Python 程序員通常用 C 重寫最里面的循環(huán),并從 Python 調(diào)用編譯后的 C 函數(shù)。有許多項目旨在使這種優(yōu)化更容易,例如 Cython ,但它們通常需要學(xué)習(xí)新的語法。理想情況下, Python 程序員希望在不使用其他編程語言的情況下使現(xiàn)有的 Python 代碼更快,而且,自然地,許多人希望使用加速器來從他們的代碼中獲得更高的性能。

Numba :高性能計算的高生產(chǎn)率

你為什么不想在 Numba 上用 Python Anaconda 編譯一個 CUDA 的 Python 編譯器,因為你不想用 Python 的 GPUs 編譯一個 PythonCPU 語言。答案當(dāng)然是運行本機編譯代碼比運行動態(tài)解釋代碼快很多倍。 Numba 的工作原理是允許您為 Python 函數(shù)指定類型簽名,這樣可以在運行時進行編譯(這是“ Just-in-time ”或 JIT 編譯)。 Numba 動態(tài)編譯代碼的能力意味著您不會放棄 Python 的靈活性。這是向提供高生產(chǎn)率編程和高性能計算的理想組合邁出的一大步。

使用 Numba ,現(xiàn)在可以編寫標(biāo)準(zhǔn)的 Python 函數(shù)并在支持 CUDA -GPU 上運行它們。 Numba 是為面向數(shù)組的計算任務(wù)而設(shè)計的,很像廣泛使用的 NumPy 庫。面向數(shù)組的計算任務(wù)中的數(shù)據(jù)并行性自然適合 GPUs 這樣的加速器。 Numba 理解 NumPy 數(shù)組類型,并使用它們生成高效的編譯代碼,以便在 GPUs 或多核 CPU 上執(zhí)行。所需的編程工作可以簡單到添加一個函數(shù)修飾符來指示 Numba 為 GPU 編譯。例如,下面代碼中的 @vectorize 修飾符在運行時生成標(biāo)量函數(shù) Add 的編譯矢量化版本,以便可以在 GPU 上并行處理數(shù)據(jù)數(shù)組。

import numpy as np
from numba import vectorize @vectorize(['float32(float32, float32)'], target='cuda')
def Add(a, b): return a + b # Initialize arrays
N = 100000
A = np.ones(N, dtype=np.float32)
B = np.ones(A.shape, dtype=A.dtype)
C = np.empty_like(A, dtype=A.dtype) # Add arrays on GPU

C = Add(A, B)要在 CPU 上編譯并運行相同的函數(shù),我們只需將目標(biāo)更改為“ CPU ”,這將在 CPU 上產(chǎn)生編譯的、矢量化的 C 代碼級別的性能。這種靈活性有助于您生成更多可重用的代碼,并允許您在沒有 GPUs 的機器上進行開發(fā)。

GPU -Python 加速庫

CUDA 并行計算平臺的優(yōu)勢之一是其可用 GPU – 加速庫 的寬度。Numba 團隊的另一個項目叫做 pyculib ,提供到 CUDA cuBLAS (稠密線性代數(shù)) 、 快速傅里葉變換 和 cuRAND (隨機數(shù)生成) 庫的 Python 接口。許多應(yīng)用程序只需使用這些庫就可以獲得顯著的加速,而無需編寫任何特定于 GPU 的代碼。

import numpy as np
from pyculib import rand as curand prng = curand.PRNG(rndtype=curand.PRNG.XORWOW)
rand = np.empty(100000)
prng.uniform(rand)

print rand[:10]使用 CUDA Python 實現(xiàn)大規(guī)模并行

Anaconda (以前的 Continuum Analytics )認(rèn)識到,在某些計算上實現(xiàn)大的加速需要一個更具表現(xiàn)力的編程接口,對并行性的控制比庫和自動循環(huán)矢量化所能提供的更詳細。因此, Numba 還有另一組重要的特性,它們構(gòu)成了非正式的“ CUDA Python ”。 NUBA 公開了 CUDA 編程模型,就像 CUDA C / C ++中一樣,但是使用純 Python 語法,這樣程序員就可以創(chuàng)建定制的、并行的并行內(nèi)核,而不必留下 Python 的舒適性和優(yōu)點。 Numba 的 CUDA JIT (通過 decorator 或 function call 提供)在運行時編譯 CUDA Python 函數(shù),將它們專門化為您使用的類型,而且它的 CUDA Python API 提供了對數(shù)據(jù)傳輸和 CUDA 流等功能的顯式控制。

下面的代碼示例用一個簡單的 Mandelbrot set 內(nèi)核演示了這一點。請注意, mandel_kernel 函數(shù)使用 Numba 提供的 cuda.threadIdx, cuda.blockIdx, cuda.blockDim, and cuda.gridDim 結(jié)構(gòu)來計算當(dāng)前線程的全局 X 和 Y 像素索引。與其他 CUDA 語言一樣,我們通過在括號中插入一個“執(zhí)行配置”( CUDA – 表示運行內(nèi)核的線程數(shù)和線程塊數(shù))來啟動內(nèi)核函數(shù)名和參數(shù)列表: mandel_kernel[griddim, blockdim](-2.0, 1.0, -1.0, 1.0, d_image, 20) 。您還可以看到使用 to_hostto_device API 函數(shù)在 GPU 之間復(fù)制數(shù)據(jù)。

您可以在 Github 上獲得完整的 Mandelbrot 示例的 Jupyter 筆記本 。

@cuda.jit(device=True)
def mandel(x, y, max_iters): """ Given the real and imaginary parts of a complex number, determine if it is a candidate for membership in the Mandelbrot set given a fixed number of iterations. """ c = complex(x, y) z = 0.0j for i in range(max_iters): z = z*z + c if (z.real*z.real + z.imag*z.imag) >= 4: return i return max_iters @cuda.jit
def mandel_kernel(min_x, max_x, min_y, max_y, image, iters): height = image.shape[0] width = image.shape[1] pixel_size_x = (max_x - min_x) / width pixel_size_y = (max_y - min_y) / height startX = cuda.blockDim.x * cuda.blockIdx.x + cuda.threadIdx.x startY = cuda.blockDim.y * cuda.blockIdx.y + cuda.threadIdx.y gridX = cuda.gridDim.x * cuda.blockDim.x; gridY = cuda.gridDim.y * cuda.blockDim.y; for x in range(startX, width, gridX): real = min_x + x * pixel_size_x for y in range(startY, height, gridY): imag = min_y + y * pixel_size_y image[y, x] = mandel(real, imag, iters) gimage = np.zeros((1024, 1536), dtype = np.uint8)
blockdim = (32, 8)
griddim = (32,16) start = timer()
d_image = cuda.to_device(gimage)
mandel_kernel[griddim, blockdim](-2.0, 1.0, -1.0, 1.0, d_image, 20) d_image.to_host()

dt = timer() - start print "Mandelbrot created on GPU in %f s" % dt imshow(gimage)在帶有 NVIDIA Tesla P100GPU 和 Intel Xeon E5-2698 v3CPU 的服務(wù)器上, CUDA Python Mandelbrot 代碼的運行速度比純 Python 版本快近 1700 倍。 1700x 似乎是一個不切實際的加速,但請記住,我們將編譯的、并行的、 GPU – 加速的 Python 代碼與 CPU 上解釋的單線程 Python 代碼進行比較。

今天就開始使用 Numba

Numba 為 Python 開發(fā)人員提供了一個進入 GPU 加速計算的簡單入口,并為使用日益復(fù)雜的 CUDA 代碼提供了一條路徑,只需使用最少的新語法和行話。您可以從簡單的函數(shù)修飾符開始自動編譯函數(shù),或者使用 pyculib 公開的功能強大的 CUDA 庫。隨著您對并行編程概念的深入理解,以及當(dāng)您需要對并行線程進行富有表現(xiàn)力和靈活的控制時, CUDA 是可用的,無需您在第一天就投入使用。

Numba 是一個經(jīng)過 BSD 許可的開源項目,它本身嚴(yán)重依賴于 LLVM 編譯器的功能。 Numba 的 GPU 后端使用了基于 LLVM 的 NVIDIA 編譯器 SDK 。 CUDA 庫的 膿皰 包裝器也是開源的,并且是 BSD 許可的。

要開始使用 Numba ,第一步是下載并安裝 Anaconda 分布 ,這是一個“完全免費的企業(yè)級 Python 發(fā)行版,用于大規(guī)模數(shù)據(jù)處理、預(yù)測分析和科學(xué)計算”,其中包括許多流行的軟件包( NumPy 、 Scipy 、 Matplotlib 、 iPython 等)和功能強大的包管理器“ conda ”。一旦安裝了 Anaconda ,輸入 conda install numba cudatoolkit pyculib 安裝所需的 CUDA 包。然后查看 ContinuumIO github 存儲庫上的 CUDA 的 Numba 教程

關(guān)于作者

Mark Harris 是 NVIDIA 杰出的工程師,致力于 RAPIDS 。 Mark 擁有超過 20 年的 GPUs 軟件開發(fā)經(jīng)驗,從圖形和游戲到基于物理的模擬,到并行算法和高性能計算。當(dāng)他還是北卡羅來納大學(xué)的博士生時,他意識到了一種新生的趨勢,并為此創(chuàng)造了一個名字: GPGPU (圖形處理單元上的通用計算)。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    4823

    瀏覽量

    102666
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    27

    文章

    4652

    瀏覽量

    128499
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1608

    瀏覽量

    48989
收藏 人收藏

    評論

    相關(guān)推薦

    GPU加速計算平臺是什么

    GPU加速計算平臺,簡而言之,是利用圖形處理器(GPU)的強大并行計算能力來加速科學(xué)計算、數(shù)據(jù)分析、機器學(xué)習(xí)等復(fù)雜
    的頭像 發(fā)表于 10-25 09:23 ?119次閱讀

    有沒有大佬知道NI vision 有沒有辦法通過gpu和cuda加速圖像處理

    有沒有大佬知道NI vision 有沒有辦法通過gpu和cuda加速圖像處理
    發(fā)表于 10-20 09:14

    labview字符串數(shù)組轉(zhuǎn)化為數(shù)值數(shù)組

    在LabVIEW中,將字符串數(shù)組轉(zhuǎn)換為數(shù)值數(shù)組是一項常見的任務(wù),尤其是在處理數(shù)據(jù)采集、信號處理或用戶輸入時。 1. 理解LabVIEW的數(shù)據(jù)類型 在開始之前,了解LabVIEW中的數(shù)據(jù)類型是非
    的頭像 發(fā)表于 09-04 17:47 ?1170次閱讀

    打破英偉達CUDA壁壘?AMD顯卡現(xiàn)在也能無縫適配CUDA

    電子發(fā)燒友網(wǎng)報道(文/梁浩斌)一直以來,圍繞CUDA打造的軟件生態(tài),是英偉達在GPU領(lǐng)域最大的護城河,尤其是隨著目前AI領(lǐng)域的發(fā)展加速,市場火爆,英偉達GPU+CUDA的開發(fā)生態(tài)則更加穩(wěn)固,AMD
    的頭像 發(fā)表于 07-19 00:16 ?4379次閱讀

    借助NVIDIA Aerial CUDA增強5G/6G的DU性能和工作負(fù)載整合

    Aerial CUDA 加速無線接入網(wǎng) (RAN)可加速電信工作負(fù)載,使用 CPU、GPU 和 DPU 在云原生加速計算平臺上提供更高水平的
    的頭像 發(fā)表于 05-24 11:10 ?479次閱讀
    借助NVIDIA Aerial <b class='flag-5'>CUDA</b>增強5G/6G的DU性能和工作負(fù)載整合

    借助全新 AMD Alveo? V80 計算加速卡釋放計算能力

    對于大規(guī)模數(shù)據(jù)處理,最佳性能不僅取決于原始計算能力,還取決于高存儲器帶寬。 因此,全新 AMD Alveo? V80 計算加速卡專為具有大型數(shù)據(jù)集的內(nèi)存受限型應(yīng)用
    發(fā)表于 05-16 14:09 ?181次閱讀
    借助全新 AMD Alveo? V80 <b class='flag-5'>計算</b><b class='flag-5'>加速</b>卡釋放<b class='flag-5'>計算</b>能力

    英偉達CUDA-Q平臺推動全球量子計算研究

    英偉達今日公布了其重要戰(zhàn)略決策,即采用開源的CUDA-Q平臺,旨在推動德國、日本和波蘭等國家超運中心在量子計算領(lǐng)域的創(chuàng)新研究。CUDA-Q作為英偉達推出的一款開源平臺,不僅與QPU無關(guān),還實現(xiàn)了量子
    的頭像 發(fā)表于 05-14 11:45 ?589次閱讀

    NVIDIA通過CUDA-Q平臺為全球各地的量子計算中心提供加速

    德國、日本和波蘭的超級計算機利用 Grace-Hopper 和量子-經(jīng)典加速超算平臺推進量子計算研究。
    的頭像 發(fā)表于 05-14 09:15 ?295次閱讀

    NVIDIA 通過 CUDA-Q 平臺為全球各地的量子計算中心提供加速

    德國、日本和波蘭的超級計算機利用 Grace-Hopper 和量子-經(jīng)典加速超算平臺推進量子計算研究 ? ? 德國漢堡 —— 國際超算大會(ISC)—— 2024 年 5 月 13 日
    發(fā)表于 05-13 15:21 ?170次閱讀
    NVIDIA 通過 <b class='flag-5'>CUDA</b>-Q 平臺為全球各地的量子<b class='flag-5'>計算</b>中心提供<b class='flag-5'>加速</b>

    恩智浦推出全新面向工業(yè)與物聯(lián)網(wǎng)應(yīng)用的MCX微控制器產(chǎn)品組合

    恩智浦推出全新面向工業(yè)與物聯(lián)網(wǎng)應(yīng)用的MCX微控制器產(chǎn)品組合,賦能安全邊緣計算,其中MCX N系列為用戶帶來高能效多任務(wù)處理、AI加速、智能外設(shè)與靈活的開發(fā)體驗。
    的頭像 發(fā)表于 03-21 13:33 ?1406次閱讀
    恩智浦推出全新<b class='flag-5'>面向</b>工業(yè)與物聯(lián)網(wǎng)應(yīng)用的MCX微控制器產(chǎn)品組合

    PHP中數(shù)組的使用方法!

    PHP中數(shù)組的使用方法! PHP是一種廣泛使用的網(wǎng)絡(luò)編程語言,它的數(shù)組功能非常強大且靈活。數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),它允許我們在單個變量中存儲多個值。 在本篇文章中,我將詳細解釋PHP
    的頭像 發(fā)表于 01-12 15:11 ?466次閱讀

    加速計算卡與AI顯卡有什么區(qū)別?

    與原理 1. 加速計算卡:加速計算卡是一種用于高性能計算的硬件設(shè)備,主要用于加速復(fù)雜
    的頭像 發(fā)表于 01-09 14:10 ?1146次閱讀

    深入淺出理解PagedAttention CUDA實現(xiàn)

    vLLM 中,LLM 推理的 prefill 階段 attention 計算使用第三方庫 xformers 的優(yōu)化實現(xiàn),decoding 階段 attention 計算則使用項目編譯 CUDA 代碼實現(xiàn)。
    的頭像 發(fā)表于 01-09 11:43 ?1593次閱讀
    深入淺出理解PagedAttention <b class='flag-5'>CUDA</b>實現(xiàn)

    什么是加速計算?加速計算的應(yīng)用場景和解決方案

    隨著科技的發(fā)展,處理大量數(shù)據(jù)和進行復(fù)雜計算的需求越來越高,人工智能、大數(shù)據(jù)和物聯(lián)網(wǎng)等領(lǐng)域更是如此,傳統(tǒng)的計算方式已經(jīng)無法滿足這些需求。因此,加速計算作為一種現(xiàn)代
    的頭像 發(fā)表于 12-28 10:07 ?2004次閱讀
    什么是<b class='flag-5'>加速</b><b class='flag-5'>計算</b>?<b class='flag-5'>加速</b><b class='flag-5'>計算</b>的應(yīng)用場景和解決方案

    OpenCV4.8 CUDA編程代碼教程

    OpenCV4支持通過GPU實現(xiàn)CUDA加速執(zhí)行,實現(xiàn)對OpenCV圖像處理程序的加速運行,當(dāng)前支持加速的模塊包括如下。
    的頭像 發(fā)表于 12-05 09:56 ?923次閱讀
    OpenCV4.8 <b class='flag-5'>CUDA</b>編程代碼教程