当我尝试运行以下代码时,出现此错误:
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只处理全局函数?我的解释是否正确?如果是这样,我能做我想做的事吗?
答案 0 :(得分:1)
您无法从主机代码调用__device__
函数。如果您指出PyCUDA教程代码显示了如何执行此操作,我希望看到该教程。
我不清楚你要通过从主机代码调用__device__
函数来完成什么,这是通过普通内核(__global__
)启动无法完成的。