2012-08-10 80 views
1

我是PyCUDA的新手。我想用__global__聲明的函數調用__device__聲明的函數。我如何在pyCUDA中做到這一點?從pycuda的全局函數中調用設備函數

import pycuda.driver as cuda 
from pycuda.compiler import SourceModule 
import numpy as n 
import pycuda.autoinit 
import pycuda.gpuarray as gp 

d=gp.zeros(shape=(128,128),dtype=n.int32) 
h=n.zeros(shape=(128,128),dtype=n.int32) 
mod=SourceModule(""" 
     __global__ void matAdd(int *a) 
    { 
      int px=blockIdx.x*blockDim.x+threadIdx.x; 
      int py=blockIdx.y*blockDim.y+threadIdx.y;   
      a[px*128+py]+=1; 
      matMul(px); 

    } 
     __device__ void matMul(int px) 
    { 
     px=5; 
    } 

""") 

m=mod.get_function("matAdd") 
m(d,block=(32,32,1),grid=(4,4)) 
d.get(h) 

上面的代碼是給我下面的錯誤

7-linux-i686.egg/pycuda/../include/pycuda kernel.cu] 
[stderr: 
kernel.cu(8): error: identifier "matMul" is undefined 

kernel.cu(12): warning: parameter "px" was set but never used 

1 error detected in the compilation of "/tmp/tmpxft_00002286_00000000-6_kernel.cpp1.ii". 
] 
+1

我不確定我是否理解這個問題。在PyCUDA中,您仍然使用CUDA C編寫設備代碼。如果您使用C++而不是Python編寫主機代碼,那也沒什麼兩樣。那麼你在問什麼? – talonmies 2012-08-10 13:29:28

回答

1

指的它之前,您應該聲明你matMul功能。你可以做這樣的:

__device__ void matMul(int px); // declaration 
    __global__ void matAdd(int *a) 
{ 
     int px=blockIdx.x*blockDim.x+threadIdx.x; 
     int py=blockIdx.y*blockDim.y+threadIdx.y;   
     a[px*128+py]+=1; 
     matMul(px); 

} 
    __device__ void matMul(int px) // implementation 
{ 
    px=5; // by the way, this assignment does not propagate outside this function 
} 

,或者只是移動整個matMul功能是matAdd之前。

+0

我的壞...我應該認爲... – 2012-08-10 15:50:38

+0

這是這種情況的可接受的解決方案,但如果matMul是在單獨的SourceModule類中定義的呢?同樣的錯誤仍然存​​在.. – 2012-08-10 16:01:59

+0

[你需要在一個編譯單元中有所有的功能](http://stackoverflow.com/a/5994345/929437),所以除了嘗試使用CUDA5.0 [支持單獨的編譯和鏈接](http://www.youtube.com/watch?v=0fWGCveQMHE&t=9m6s) – aland 2012-08-10 16:08:48