PyCUDA + Threading = Alças inválidas em invocações de kernel
Vou tentar deixar isso claro;
Eu tenho duas classes;GPU(Object)
, para acesso geral à funcionalidade da GPU, emultifunc(threading.Thread)
para uma função específica, estou tentando multi-dispositivo-ify.GPU
contém a maior parte do processamento da 'primeira vez' necessário para todos os casos de uso subsequentes, entãomultifunc
é chamado deGPU
com o seuself
instância passada como__init__
argumento (junto com as filas habituais e outras
Infelizmente,multifunc
craps fora com:
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
O primeiro porto de escala era, obviamente, as dimensões do bloco, mas elas estão dentro do alcance (mesmo comportamento, mesmo que eu forceblock=(1,1,1)
, da mesma forma grade.
Basicamente, dentro demultifunc
, todas as funções usuais CUDA memalloc etc funcionam bem (o que implica que não é um problema de contexto). Portanto, o problema deve estar com oSourceModule
ing da própria função do kernel.
Tenho um modelo de kernel contendo todo o meu código CUDA com escopo no arquivo e a modelagem é feita comjinja2
noGPU
inicialização. Independentemente de esse objeto de modelo ser convertido para umSourceModule
objeto emGPU
e passou paramultifunc
, ou se for convertido emmultifunc
acontece a mesma coisa.
@Google tem sido amplamente inútil para esse problema específico, mas, seguindo a pilha, presumo que oInvalid Handle
sendo referido é o identificador da função do kernel, em vez de algo estranho acontecendo com as dimensões do bloc
Estou ciente de que esta é uma situação muito difícil, mas tenho certeza de que alguém pode ver um problema que eu perdi.