gpu并行计算与cuda编程,python gpu编程
Python并行计算pycuda测试、比较和分析增量学习算法可以同时学习网络的节点和参数。但是随着模型结构的增长,计算成本越来越高。降低计算时间成本的方法有两种:(1)研究模型划分方法,将较大的模型分成若干个较小的子模型;(2)通过提高计算机的计算能力(GPU或CPU)。TX2可以使用CUDA进行GPU并行计算,pycuda作为python的并行计算库,可以方便GPU并行加速。本文采用pycuda实现并行加速,并与numpy进行了比较。
并行计算安装及pycuda简单使用教程请参考pycuda官网。
一个简单的例子:导入pycuda。auto init导入pycuda。驱动程序作为drv导入numpy作为NP从pycuda导入时间。com piler import source module=source module( _ _ g global _ _ void Text _ GPU(float * A,float *B,float *K,size _ t N){ int bid=block idx . x;int tid=threadIdx.x_ _ shared _ _ float s _ data[2];s _ data[tid]=(A[bid * 2 tid]-B[bid * 2 tid]);_ _ syncthreads();if(tid==0){ float sum _ d=0.0;for(int I=0;在;I){ sum _ d=(s _ data[I]* s _ data[I]);} K[bid]=exp(-sum _ d);} } )multiply _ them=mod . get _ function( Text _ GPU )TIC=time . time()A=NP . random . random((1000,20))。astype(NP . float 32)B=NP . random . random((1000,20))。astype(NP . float 32)K=NP . zeros((1000,),dtype=NP . float 32)N=20N=NP . int 32(N)multiply _ them(drv。在(A)中,drv。在(B)中,drv。InOut(K),N,block=(20,1,1),grid=(1000,1))toc=time.time()print(时间成本为: str(TOC-TIC)]时间成本:0.00536298751831
grid和block block之间的通信是通过全局内存进行的,同一个Block中的线程可以通过共享内存相互通信。每个线程块都有自己的本地内存。
source mod=source module( _ global _ _ void text _ GPU(.) {.}).这个代码是一个C内核函数,定义了GPU并行计算的主要代码。例如,定义一个将两个向量相加的核函数。
mod=source module( _ _ global _ _ void multiply _ them(float * dest,float *a,float * b){ const int I=threadidx . x;dest[I]=a[I]b[I];}“”)_ shared _ variable;在同一块下定义共享内存。
__syncthreads()同步函数。当上述所有代码都在同一个块中运行时,执行同步函数下面的代码。
Blockdx.x和threadIdx.x blockIdx.x取块的ID,threadIdx.x取线程的ID。
相比没有GPU加速的numpy计算,numpy模式I(非for循环)导入numpy为NP导入时间a=np.random.random ((1000,20))。as type(NP . float 32)b=NP . random . random((1000,20))。astype(NP . float 32)TIC=time . time()dk=A-Bdd=[NP . sum(A * * 2)for A in dk]K1=NP . exp(-NP . array(DD))TOC=time . time()print(时间成本为: str(toc-tic))时间成本为:0.0174951553345
Numpy模式二(for loop)导入numpy为NP导入时间a=np.random.random ((1000,20))。as type(NP . float 32)b=NP . random . random((1000,20))。astype(NP . float 32)def gua session _ kernel(x,u):d=x-u DD=[NP . sum(A * * 2)for A in d]return NP . exp(-sum(DD))TIC=time . time()Phi _ x=[]for j in range(1000):Phi _ x . append(gua session _ kernel(A[j],B[j]))toc=time.time()print(时间成本为: str(toc-tic)) print(Phi_x)时间成本为:0.00
对照表列出了上述三种方法的计算成本。可以看出,GPU加速的计算时间开销最低,而FOR循环计算的计算时间开销最高。这只是初步的比较。在实际应用中,有时候GPU加速并不比CPU快。当数据维度很小时,GPU加速的预配置也需要额外的计算,有时用GPU加速的计算时间比CPU长。
Typepucu无for循环CPU有for循环时间开销0.00536298751810.0174955535最后应用于增量算法,因为节点数增长缓慢,计算每一迭代步开销的三种方式如下图所示。我们发现,在运算初期,节点数量较少,GPU的计算时间成本高于CPU,但后来GPU和CPU(……看起来GPU并没有太大优势,主要是节点数量还少,一百多个节点),相信随着节点的进一步增加,GPU的效能会更加突出。
结论介绍了pycuda,实现了python的GPU并行计算。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。