web-dev-qa-db-ja.com

OpenCLコードは特定のGPU用にコンパイルする必要がありますか?

ほとんどのOpenCLチュートリアルは、OpenCLの優れた紹介を提供しますが、コンパイルターゲットの相互運用性の問題に関する情報は見つかりませんでした。ターゲットGPU用にOpenCLコードをコンパイルする必要があるようです。 OpenCLを使用してアプリケーションのバイナリ配布を行う場合、ベンダープラットフォーム用にいくつかのビルドを作成する必要がありますか?

2
wirrbel

OpenCLは、OpenGLなどの他のGPUライブラリと同様に機能します。あなたが出荷するものは中間表現です。 GPUのドライバーは、実行時に特定のデバイスで実行するための最終的なコンパイルを行います。 ここ はKhronosからのOpenCLスライドプレゼンテーションの紹介です。

編集:OpenCL 2では、コンパイルモデルの一部が変更されてはるかに柔軟になりました。現在、新しいSPIR-V中間表現をターゲットとするLLVMバックエンドがあるため、LLVMをターゲットとするすべての言語コンパイラを使用してOpenCLをターゲットにできるはずです。それ以外は、モデルはほとんど同じですが、ステップがあり、ソースはLLVM IRにコンパイルされ、LLVM IRはSPIR-Vにコンパイルされ、ドライバーは最終的なコンパイルと実行を処理します。

3
stonemetal

いいえ、ターゲットプラットフォームごとにコンパイルされたバイナリを用意する必要はありません。OpenCLのAPIは、いくつかの異なるデバイスのカーネルバイナリのコンパイル、およびclGetProgramInfo()を使用したコンパイル済みコードの取得をサポートしています。これは、いくつかのターゲットプラットフォームに対して実行し、すべてのバイナリをディストリビューションに配置して、出荷することができます。

0
einpoklum