Я постараюсь объяснить это;
У меня есть два класса;GPU(Object)
, для общего доступа к функциям графического процессора, и 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)
, аналогично grid.
По сути, в multifunc
все обычные функции CUDA memalloc и т. Д. Работают нормально (подразумевается, что это не является проблемой контекста). Так что проблема должна быть в SourceModule
ingсама функция ядра.
У меня есть шаблон ядра, содержащий весь мой код CUDA, который имеет файловую область, и шаблонирование выполняется с jinja2
при инициализации GPU
. Независимо от того, преобразован ли этот шаблонный объект вSourceModule
объект в GPU
и переданный в multifunc
, или, если его преобразовать в multifunc
, происходит то же самое.
Google был в значительной степени бесполезен для этой частиЭто специфическая проблема, но после стека я предполагаю, что упоминаемый Invalid Handle
является дескриптором функции ядра, а не чем-то странным, что происходит с размерами блока.
Я знаю, что это очень важный момент.ситуация, но я уверен, что кто-то может увидеть проблему, которую я пропустил.