CUDA功能和通用功能
CUDA功能和通用功能
本文描述了類似于CUDA ufunc的對(duì)象。
為了支持CUDA程序的編程模式,CUDA Vectorize和GUVectorize無法產(chǎn)生常規(guī)的ufunc。而是返回類似ufunc的對(duì)象。該對(duì)象是一個(gè)近似的對(duì)象,但與常規(guī)的NumPy ufunc不完全兼容。CUDA ufunc增加了對(duì)傳遞設(shè)備內(nèi)陣列(已在GPU設(shè)備上)的支持,以減少PCI Express總線上的流量。它還接受用于以異步模式啟動(dòng)的stream關(guān)鍵字。
示例:基本示例
import math
from numba import vectorize, cuda
import numpy as np
@vectorize([‘float32(float32, float32, float32)’,
‘float64(float64, float64, float64)’],
target=‘cuda’)
def cu_discriminant(a, b, c):
return math.sqrt(b ** 2 - 4 * a * c)
N = 10000
dtype = np.float32
prepare the input
A = np.array(np.random.sample(N), dtype=dtype)
B = np.array(np.random.sample(N) + 10, dtype=dtype)
C = np.array(np.random.sample(N), dtype=dtype)
D = cu_discriminant(A, B, C)
print(D) # print result
示例:調(diào)用設(shè)備功能
所有CUDA ufunc內(nèi)核都可以調(diào)用其他CUDA設(shè)備功能:
from numba import vectorize, cuda
define a device function
@cuda.jit(‘float32(float32, float32, float32)’, device=True, inline=True)
def cu_device_fn(x, y, z):
return x ** y / z
define a ufunc that calls our device function
@vectorize([‘float32(float32, float32, float32)’], target=‘cuda’)
def cu_ufunc(x, y, z):
return cu_device_fn(x, y, z)
通用CUDA功能
類似于CUDA ufunc功能,可以使用CUDA在GPU上執(zhí)行通用ufunc。這可以通過以下方式完成:
from numba import guvectorize
@guvectorize([‘void(float32[:,:], float32[:,:], float32[:,:])’],
‘(m,n),(n,p)->(m,p)’, target=‘cuda’)
def matmulcore(A, B, C):
…
有時(shí)gufunc內(nèi)核會(huì)使用過多的GPU資源,這可能會(huì)導(dǎo)致內(nèi)核啟動(dòng)失敗。用戶可以通過在已編譯的gufunc對(duì)象上設(shè)置max_blocksize屬性來顯式控制線程塊的最大size。
from numba import guvectorize
@guvectorize(…, target=‘cuda’)
def very_complex_kernel(A, B, C):
…
very_complex_kernel.max_blocksize = 32 # limits to 32 threads per block
總結(jié)
以上是生活随笔為你收集整理的CUDA功能和通用功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。