2015-06-03 31 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