2015-06-03 32 views
1

我使用pycuda,我想知道是否有一个等同于功能cudaMemcpyToSymbolcudaMemcpyToSymbol在pycuda

我想从主机复制一个恒定的装置类似下面

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) 

回答

2

的PyCUDA直接执行如下CUDA驱动程序API,所以你可以使用任何驱动程序API代码,你可以找到一个模型,但也有使这项工作需要两样东西:

  1. 使用日e模块功能module.get_global()检索编译源模块内的符号的设备指针
  2. 使用driver.memcpy_htod将值复制到该指针。请注意,PyCUDA API要求对象支持Python缓冲区协议。实际上,这意味着你应该在Python端使用numpy.ndarray或类似的东西。

这实际上是cudaMemcpyToSymbol所做的。

+0

你好@talonmies, 我已经试过这 'CONST = numpy.int32(20)'' CONSTd,_ = mod.get_global( “CONSTd”)'' cuda.memcpy_htod(CONSTd,CONST)' 'kern = mod.get_function(“test”)' 但我得到这个错误 'TypeError:'numpy.int32'没有缓冲接口' 这很奇怪,因为它在我使用数组dtype – SOCKet

+0

没错。这与你在其他结构问题中的问题是一样的。 PyCUDA *要求*传递给CUDA API的对象支持Python缓冲协议。文档明确提到了这一点。你最好的选择是使用numpy ndarrays。然后它会工作 – talonmies

+0

@talomnies,这是工作,谢谢 – SOCKet