使用PyCUDA调用__device__函数会返回错误

时间:2013-10-14 18:22:39

标签: extern pycuda

当我尝试运行以下代码时,出现此错误:

Traceback (most recent call last):
  File "C:\temp\GPU Program Shell.py", line 28, in <module>
    dev=mod.get_function("lol")
  File "C:\Python33\lib\site-packages\pycuda\compiler.py", line 285, in get_function
    return self.module.get_function(name)
pycuda._driver.LogicError: cuModuleGetFunction failed: not found

以下是代码:

mod = SourceModule("""

extern "C" {
__device__ void lol(double *a)
{
    a[0]=1;
}


__global__ void kernel(double *a)
{
    const int r = blockIdx.x*blockDim.x + threadIdx.x;
    a[r] = 1;
}
}
""")

max_length = 5
a = numpy.zeros(max_length)
a_gpu = cuda.mem_alloc(a.nbytes)
cuda.memcpy_htod(a_gpu, a)
func = mod.get_function("kernel")
dev=mod.get_function("lol")
dev(a_gpu)
newa = numpy.empty_like(a)
cuda.memcpy_dtoh(newa, a_gpu)

print(newa)
print(a)

正如您可能看到的,这是对PyCUDA教程代码的略微修改。我的目的是调用这个设备功能,它将启动内核并集成东西,并且通常会让我的生活变得更轻松。我做了一些谷歌搜索,我知道我必须将“extern”c“”放入我的代码中,因为名称损坏并且在我刚刚使用PyCUDA启动内核而不是设备功能之前已经取得了成功。同样,如果我改变我的代码来启动内核而不是设备功能,它就会按照我的意愿行事。我在这里缺少什么?

卡斯滕

稍微查看一下设备接口参考文档,看起来函数get_function只处理全局函数?我的解释是否正确?如果是这样,我能做我想做的事吗?

1 个答案:

答案 0 :(得分:1)

您无法从主机代码调用__device__函数。如果您指出PyCUDA教程代码显示了如何执行此操作,我希望看到该教程。

我不清楚你要通过从主机代码调用__device__函数来完成什么,这是通过普通内核(__global__)启动无法完成的。