首页 > 编程知识 正文

python的numba加速,python 效率

时间:2023-05-06 01:58:51 阅读:167931 作者:1466

要使用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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。