1

amd プラットフォームの opencl プログラムで、プログラムを 2 回ビルドする必要があることを確認しました。一度 clBuildProgram...(); を使用します。もう 1 つは、コード全体をビルドするときです。なぜこのビルドを 2 回行うのでしょうか。

4

1 に答える 1

10

OpenCL では、ホスト コードのコンパイルとカーネル コードのコンパイルは 2 つの別個のステップです。

コード全体と呼ばれるものをコンパイルする場合、基本的にはホスト コード、つまり、OpenCL カーネルの実行を調整および制御するコードをコンパイルしているだけです。

OpenCL 対応デバイス (CPU、GPU、DSP、FPGA、アクセラレータなど) で実行されるカーネル コードには、2 つの主なコンパイル オプションがあります。

  • 実際の OpenCL カーネル ソースを別の .cl ファイルとしてプログラムに含めるか、ホスト コードに文字列として埋め込むことができます。このコンパイル パスを使用する場合は、 with にprogram渡されるオブジェクトを作成します。その後、ホスト コードは実行時にオンライン コンパイラを使用して、カーネルを実行する OpenCL 対応デバイスの目的のアーキテクチャ用にカーネルをコンパイルできます。これの利点は、(ホスト プログラムを作成するときに) OpenCL デバイスのアーキテクチャ (Intel、AMD、Nvidia など) を事前に知る必要がないことです。そのアーキテクチャ用のコンパイラさえないかもしれません。不利な点は、カーネル ソース コードが表示されることです。これは、貴重な IP が組み込まれている場合には望ましくありません。clBuildProgramclCreateProgramWithSource
  • サポートするすべての OpenCL デバイス アーキテクチャ用に事前にカーネルをコンパイルし、それらのカーネルのバイナリをカーネル ソースではなくホスト コードと共に出荷することを決定する場合があります。このコンパイル パスを使用する場合は、 with にprogram渡されるオブジェクトを作成します。clBuildProgramclCreateProgramWithBinary

また、両方のアプローチの利点を組み合わせ、カーネルの中間表現を出荷できるようにするSPIR 仕様を確認することもできます。そのため、すべてのターゲット OpenCL コンパイラを用意する必要も、カーネルのプレーン ソース コードを出荷します。

于 2013-10-05T18:09:51.800 に答える