最近、Ubuntu 12.04 マシンで OpenCL をいじっています。を呼び出すとcl::Platform::get
、エラー コード -1001 が返されます。いくつかの調査の結果、これは c 呼び出しgetPlatformIDs
が有効なプラットフォームを見つけられなかった場合に発生することがわかりました。これは、/etc/OpenCL/vendors/ ディレクトリに .icd ファイルがない場合、または実装が) を呼び出してファイルを開くことはできませんdlopen
。
しかし、私はこれらすべての可能性をテストしました。/etc/OpenCL/vendors/ で、「libcuda.so」という行を含む nvidia.icd を見つけました。次に、このファイル名を呼び出そうとしましたがdlopen
、成功しました。それでも、私のプログラムはまだエラー コード -1001 を返します。私の nvidia ドライバーは他のすべての点でうまく機能し、プログラムをコンパイルすることができます。何が間違っている可能性がありますか?
ジスタック
編集: 追加情報: nvidia-current-dev ドライバーを使用しています。nvidia GeForce GT 540M を実行しています。
編集: 最近興味深いものを見つけました: これ は、 icdローダーに関する Khronos の仕様です。それは言います:
ベンダー ICD のライブラリを正常にロードすると、ICD ローダーはライブラリから次の関数を照会します: clIcdGetPlatformIDsKHR、clGetPlatformInfo、および clGetExtensionFunctionAddress。これらの関数のいずれかが存在しない場合、ICD ローダーは閉じてライブラリを無視します。
そして、これは nvidia プラットフォームをロードしようとしている icd ローダーを実装している誰かからの投稿です。それは言います:
dlsym() を使用して libcuda.so から clGetExtensionFunctionAddress と clGetPlatformInfo を取得でき、次に clGetExtensionFunctionAddress を使用して clIcdGetPlatformIDsKHR を取得できます。
私の実験では、3 つの関数のうち 2 つだけを正常にクエリできました -clGetPlatformInfo
とclGetExtensionFunctionAddress
. フォーラムの投稿が示唆しているように、もう1つは失敗しましclGetExtensionFunctionAddress
たclIcdGetPlatformIDsKHR
。clIcdGetPlatformIDsKHR
Khronos によって実装された ICD ローダーが仕様に完全に従う場合、クエリが失敗し、ライブラリが無視されるため、失敗することは理にかなっています。それを考えると、私が知らない別の新しいバージョンがない限り、nvidiaの実装は仕様を完全に実装していないようです。さらに、nvidia プラットフォームで OpenCL を問題なく動作させることができる人もいます。何か不足していますか?