当我尝试运行以下代码时,出现此错误:
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 只处理全局函数?我的解释正确吗?如果是这样,我能做我想做的事吗?