我会尽力说明这一点;
我有两节课;GPU(Object)
,用于对 GPU 功能的一般访问,以及multifunc(threading.Thread)
我正在尝试多设备化的特定功能。包含所有后续用GPU
例所需的大部分“第一次”处理,因此multifunc
从其实例作为参数传递(以及通常的队列等)调用。GPU
self
__init__
不幸的是,multifunc
废话:
File "/home/bolster/workspace/project/gpu.py", line 438, in run
prepare(d_A,d_B,d_XTG,offset,grid=N_grid,block=N_block)
File "/usr/local/lib/python2.7/dist-packages/pycuda-0.94.2-py2.7-linux-x86_64.egg/pycuda/driver.py", line 158, in function_call
func.set_block_shape(*block)
LogicError: cuFuncSetBlockShape failed: invalid handle
第一个停靠点当然是块尺寸,但它们在范围内(即使我强制也有相同的行为block=(1,1,1)
,同样网格。
基本上,在 内multifunc
,所有常用的 CUDA memalloc 等函数都可以正常工作,(这意味着它不是上下文问题)所以问题一定SourceModule
出在内核函数本身的 ing 上。
我有一个内核模板,其中包含我所有的文件范围的 CUDA 代码,并且模板是jinja2
在GPU
初始化中完成的。无论该模板化对象是否转换为SourceModule
in 中的对象GPU
并传递给multifunc
,或者其转换是否multifunc
发生相同的事情。
谷歌在这个特定问题上基本上没有用,但是按照堆栈,我假设Invalid Handle
被引用的是内核函数句柄,而不是块尺寸发生的任何奇怪的事情。
我知道这是一个非常极端的情况,但我确信有人可以看到我错过的问题。