amd プラットフォームの opencl プログラムで、プログラムを 2 回ビルドする必要があることを確認しました。一度 clBuildProgram...(); を使用します。もう 1 つは、コード全体をビルドするときです。なぜこのビルドを 2 回行うのでしょうか。
質問する
1150 次
1 に答える
10
OpenCL では、ホスト コードのコンパイルとカーネル コードのコンパイルは 2 つの別個のステップです。
コード全体と呼ばれるものをコンパイルする場合、基本的にはホスト コード、つまり、OpenCL カーネルの実行を調整および制御するコードをコンパイルしているだけです。
OpenCL 対応デバイス (CPU、GPU、DSP、FPGA、アクセラレータなど) で実行されるカーネル コードには、2 つの主なコンパイル オプションがあります。
- 実際の OpenCL カーネル ソースを別の .cl ファイルとしてプログラムに含めるか、ホスト コードに文字列として埋め込むことができます。このコンパイル パスを使用する場合は、 with に
program
渡されるオブジェクトを作成します。その後、ホスト コードは実行時にオンライン コンパイラを使用して、カーネルを実行する OpenCL 対応デバイスの目的のアーキテクチャ用にカーネルをコンパイルできます。これの利点は、(ホスト プログラムを作成するときに) OpenCL デバイスのアーキテクチャ (Intel、AMD、Nvidia など) を事前に知る必要がないことです。そのアーキテクチャ用のコンパイラさえないかもしれません。不利な点は、カーネル ソース コードが表示されることです。これは、貴重な IP が組み込まれている場合には望ましくありません。clBuildProgram
clCreateProgramWithSource
- サポートするすべての OpenCL デバイス アーキテクチャ用に事前にカーネルをコンパイルし、それらのカーネルのバイナリをカーネル ソースではなくホスト コードと共に出荷することを決定する場合があります。このコンパイル パスを使用する場合は、 with に
program
渡されるオブジェクトを作成します。clBuildProgram
clCreateProgramWithBinary
また、両方のアプローチの利点を組み合わせ、カーネルの中間表現を出荷できるようにするSPIR 仕様を確認することもできます。そのため、すべてのターゲット OpenCL コンパイラを用意する必要も、カーネルのプレーン ソース コードを出荷します。
于 2013-10-05T18:09:51.800 に答える