0

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

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 只处理全局函数?我的解释正确吗?如果是这样,我能做我想做的事吗?

4

1 回答 1

1

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

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

于 2013-10-15T04:36:07.717 回答