python调用cuda程序,cuda运算
因为读研期间需要并行做图像预处理,然后利用深度学习模型做进一步处理,所以需要实现python和cuda的交互,会用到一个非常重要的库pycuda。
大部分内容参考https://zhuanlan.zhihu.com/p/32062796? UTM _ source=qqutm _ medium=social
共享存储器:每个线程块都有自己的共享内存,块之间无法通信。同一块中的线程可以通过共享内存进行通信。使用pycuda将数据放入共享内存时,格式为_ _ shared _ _ float GPU[64];需要提前计算共享内存的大小,相当于给块中的每个线程创建一个64维的矩阵,然后计算机会把线程需要的数据提前放入矩阵中。
使用PyCuda时,原始数据以NumPy数组的形式存储在主机系统中。大多数常用的NVIDIA显卡只支持单精度浮点数。输入数组必须是float32,输入全局内存的变量必须是int32。
简化内存拷贝
PyCuda提供了三个参数处理程序,pycuda.driver.in、pycuda.driver.out和pycuda.driver.InOut,可以用来简化内存和显存之间的数据复制。比如,不用创建a_gpu,我们可以直接移动A,可以实现下面的代码:
func(cuda。InOut(a),block=(4,4,1))
准备调用函数。使用内置pycuda.driver.Function.call()方法的函数调用会增加类型识别的资源开销(参考图形界面)。要达到和上面代码一样的效果而没有这个开销,这个函数需要设置参数类型(如Python的标准库中的结构模块struct所示),然后调用函数。这样,就不再需要使用numpy.number类来确定参数的小数位数:
Grid=(1,1) block=(4,4,1)func . prepare( p )func . prepared _ call(grid,block,a _ GPU)抽象降低复杂度。使用pycuda.gpuarray.GPUArray,同样效果的代码实现起来更加简化:
import pycuda . gpuarray as gpuarray import pycuda . driver as cudaimport pycuda . autoinitimport numpya _ GPU=gpuarray . to _ GPU(numpy . random . randn(4,4)。astype(numpy . float 32))a _ doubled=(2 * a _ GPU)。get()print a_doubledprint a_gpu
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。