我正在尝试学习 pycuda,并且我有一些我想了解的问题。我认为我的主要问题是如何在 pycuda 和 cuda 文件中的函数之间进行通信。
所以,如果我有一个 C++ 文件(cuda 文件)并且在其中我有一些函数,我想在其中一个中实现 pycuda。例如,假设我想要包含一些数组的函数“compute”并进行计算他们。我的方法是什么?
1)在python中初始化数组,为GPU分配内存并将数据传输到GPU。
2)从pycuda调用mod=SourceModule(""" global void ......""")。
现在,我想问:我将如何处理这个模块?我会把所有的“计算”功能放在里面?因为,如果只是在“全局”中进行一些计算,我不知道如何在 pycuda 和c++ 函数。我如何将结果传递回 c++ 文件(cuda 文件)。
3)在cuda中,我们有线程数为'blockDIm'和块数为'gridDim'。在pycuda中?我们有块大小,块(4,4,1),这意味着16个线程??网格大小, size(16,16) 表示 256 个块?
4)我试图在pycuda中做一个来自'cuda by an example book'的例子,它添加了向量。代码如下:
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import scipy as sc
N=50*1024
a=sc.arange(0,N).astype(sc.float32)
a_gpu = cuda.mem_alloc(a.nbytes) #allocate memory on GPU
cuda.memcpy_htod(a_gpu, a) #transfer data to the GPU
b=sc.array([i**2 for i in range(0,N)]).astype(sc.float32)
b_gpu = cuda.mem_alloc(b.nbytes)#allocate memory on GPU
cuda.memcpy_htod(b_gpu, b) #transfer data to the GPU
c=sc.zeros(N).astype(sc.float32)
c_gpu = cuda.mem_alloc(c.nbytes)#allocate memory on GPU
mod =SourceModule("""
__global__ void add(int*a,int *b,int *c){
int tid=threadIdx.x + blockIdx.x*gridDim.x;
while (tid<N){
c[tid]=a[tid]+b[tid];
tid+=blockDim.x*gridDim.x;
}
}
""")
#call the function(kernel)
func = mod.get_function("add")
func(a_gpu,b_gpu,c_gpu, block=(16,16,1),grid=(16,16))
#transfer data back to CPU
cuda.memcpy_dtoh(c, c_gpu)
但它给了我一个错误:“标识符“N”未定义“
谢谢!