2

最近、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 つだけを正常にクエリできました -clGetPlatformInfoclGetExtensionFunctionAddress. フォーラムの投稿が示唆しているように、もう1つは失敗しましclGetExtensionFunctionAddressclIcdGetPlatformIDsKHRclIcdGetPlatformIDsKHRKhronos によって実装された ICD ローダーが仕様に完全に従う場合、クエリが失敗し、ライブラリが無視されるため、失敗することは理にかなっています。それを考えると、私が知らない別の新しいバージョンがない限り、nvidiaの実装は仕様を完全に実装していないようです。さらに、nvidia プラットフォームで OpenCL を問題なく動作させることができる人もいます。何か不足していますか?

4

1 に答える 1

2

私はそれを理解しました、このコマンドの出力はそれをすべて言います:

lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GF108 [GeForce GT 540M] (rev ff)

Optimus テクノロジを使用しているため、システムはデフォルトで Intel VGA コントローラを使用しています。そのため、プログラムの観点からはソフトウェアにハードウェアが接続されていないため、nvidia プラットフォームは無効です。残念ながら、オペレーティング システムに Intel チップを無視して nvidia チップのみを使用するように指示する簡単な方法はありません。また、nvidia は Linux で optimus をサポートする気がしないため、このセットアップ用のドライバーはありません。ただし、バンブルビーをインストールしてプログラムを実行するとoptirun、魅力的に機能します。

于 2012-08-12T23:40:23.227 に答える