次のような状況があります。
同じコンテキストを共有する 2 つの OpenCL デバイスを処理する 2 つのスレッド。各スレッドは、異なるバージョンの OpenCL デバイス コードをロードし、cl::Programm
インスタンスを作成して、特定のcl::Device
. ただし、createKernels
プログラムを正常にビルドした後の関数は、エラー コード -47 = で失敗します。
CL_INVALID_KERNEL_DEFINITION 引数の数など、kernel_name によって指定された __kernel 関数の関数定義の場合、引数の型は、プログラム実行可能ファイルがビルドされたすべてのデバイスで同じではありません。
複数のcl::Context
インスタンス (デバイスごとに 1 つ) を使用すると、これはうまく機能しました。OpenCL クラス図 ( http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/classDiagram.html ) を見ると、使用できない理由がわかりません。関連するプログラムを介して明確に区別できるため、1 つのコンテキスト内で複数のカーネルを持つ複数のプログラム。
CUDA SDK 5.5 内で Nvidia の OpenCL 実装を使用しています。私に生じる質問は次のとおりです。
これは OpenCL 構造の一般的な誤解であり、コンテキスト内のすべてのカーネルには一意の名前が必要であるという規則がありますか、それとも Nvidia の非 OpenCL 標準がこの特定のユース ケースを処理する方法を確認する方法の 1 つですか?
cl::Buffer
メモリが異なるデバイスにある場合でも、1 つのコンテキスト内の複数のデバイスが 1 つのコンテキストから別のデバイスへのコピーを使用できるようにしたいと考えています。