pycuda 中的 cudaMemcpyToSymbol

cudaMemcpyToSymbol in pycuda

我正在使用 pycuda,我想知道是否有等效于函数 cudaMemcpyToSymbol

我想从主机复制一个常量到设备,如下所示

import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy 
from sys import path
from struct import *
from gpustruct import GPUStruct


if __name__ == '__main__':

    # list devices
    ndevices = cuda.Device.count()
    print '{} devices found'.format(ndevices)
    for i in xrange(ndevices):
        print '  ', cuda.Device(i).name()





    # compile device.cu
    mod = SourceModule('''
    __device__ __constant__ int CONSTd;
    struct Results
        {
         float *A; 
     float *B;
     float *C;
        };

    struct fin
        {
         float *N;
        };

__global__ void  test(Results *src,fin *dest){
    int i=blockIdx.x *blockDim.x + threadIdx.x;
    src->C[i]=src->A[i]+src->B[i]+dest->N[i]+CONSTd;

    }''',
            nvcc='/opt/cuda65/bin/nvcc',
           )

kern = mod.get_function("test")




CONSTANTE=5
src_gpu = GPUStruct([(numpy.int32,'*A', numpy.ones(10,dtype=numpy.int32)),(numpy.int32,'*B', numpy.ones(10,dtype=numpy.int32)),(numpy.int32,'*C', numpy.zeros(10,dtype=numpy.int32))])
test_gpu = GPUStruct([(numpy.int32,'*N', numpy.array(10*[5],dtype=numpy.int32))])

#something like this:
**cudaMemcpyToSymbol(CONSTd, &CONSTANTE, sizeof(int));**

src_gpu.copy_to_gpu() 
test_gpu.copy_to_gpu() 
kern(src_gpu.get_ptr(),test_gpu.get_ptr(),block=(10,1,1),grid=(1,1))
src_gpu.copy_from_gpu()

print(src_gpu)

PyCUDA 实现直接遵循 CUDA 驱动程序 API,因此您可以使用您可以找到的任何驱动程序 API 代码作为模型,但要实现此功能需要两件事:

  1. 使用模块函数module.get_global()检索指向已编译源模块中符号的设备指针
  2. 使用driver.memcpy_htod将值复制到该指针。请注意 PyCUDA APIs 要求对象支持 Python 缓冲协议。实际上,这意味着您应该在 Python 端使用 numpy.ndarray 或类似的。

这实际上是 cudaMemcpyToSymbol 在幕后所做的。