これを明確にしようと思います。
2 つのクラスがあります。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
オブジェクトが でオブジェクトに変換されてGPU
に渡されるmultifunc
かどうか、またはmultifunc
同じことが起こるかどうかに関係なく。
Google はこの特定の問題に対してほとんど役に立ちませんでしたが、スタックに従って、Invalid Handle
参照されているのはブロック ディメンションで起こっている奇妙なことではなく、カーネル関数ハンドルであると想定しています。
これが非常にまれな状況であることは承知していますが、私が見逃した問題を誰かが見ることができると確信しています。