2012-08-10 78 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