要使用numbapro创建简单的矩阵向量乘法:
from numbapro import cuda
来自numba import *
导入编号为NP
导入匹配
fromtimeitimportdefault _ timerastime
n=100
@cuda.JIT(void ) float 32 [ : ]、float32[:]、float32[:] ) )
EFCu_matrix_vector(a,b,c ) :
y,x=cuda.grid (2((2)2) ) ) ) ) ) ) ) ) ) )。
if y n:
c[y]=0.0
if x n and y n:
forIinrange(n ) :
c[y] =A[y,i] * b[i]
a=NP.array(NP.random.random ) (n,n ) )、dtype=np.float32 ) )。
b=NP.array(NP.random.random ) (n,1 ) )、dtype=np.float32 ) )。
c=NP.empty_like(b )
s=time () )
da=cuda.to_device(a )
db=cuda.to_device(b )
DC=cuda.to_device(c )
Cu_matrix_vector(da,dB,dC ) )。
dC.to_host ()
e=time () )
tcuda=e - s
但是,我得到了以下错误:
numba pro.cuda drv.error.cudadrivererror : cuda _ error _ launch _ failedfailedtocopymemoryd-h
我不知道为什么主机复制的设备失败了。 请帮帮我
解决方法:
代码有多个问题。
b向量和c向量是Nx1 2D矩阵而不是1D向量,但在内核类型签名中列为“float32 [:]” - 1D向量。 此外,还使用单个索引创建索引,从而导致GPU上的运行时错误()
你的内核假设是2D网格,但只使用那一列。 这意味着许多线程进行相同的计算,并相互覆盖
由于未给出运行配置,NumbaPro正在启动包含一个线程的内核。 (nvprof是你的朋友! )
这是有效的代码。 请注意,这是使用1D网格的1D网格,在矩阵列中循环。 因此,在向量/矩阵行数较多的情况下进行了优化。 针对短矩阵和宽矩阵优化的内核需要不同的方法(并行缩小)。 但是,我要用CUBLAS sgemv。 (
from numbapro import cuda
来自numba import *
导入编号为NP
导入匹配
fromtimeitimportdefault _ timerastime
m=100000
n=100
@ cuda.JIT (void (F4 [ : ]、f4[:]、f4[:] ) )
EFCu_matrix_vector(a,b,c ) :
row=cuda.grid(1) ) ) ) )。
if(rowm ) :
sum=0
forIinrange(n ) :
sum =A[row,i] * b[i]
c[row]=sum
a=NP.array(NP.random.random ) (m,n ) )、dtype=np.float32 ) )。
b=NP.array(NP.random.random(m ),dtype=np.float32 ) ) )。
c=NP.empty_like(b )
s=time () )
da=cuda.to_device(a )
db=cuda.to_device(b )
DC=cuda.to_device(c )
Cu _ matrix _ vector [ [ m511 ]/512,512 ] [ da、dB、DC]
dC.to_host ()
print C
e=time () )
tcuda=e - s
标签: python、numpy、cuda、numba、numba-pro
资料来源: https://codeday.me/bug/2019 05 17/1120484.html