0

OpenCLを初めて使用する場合、次のシナリオが可能かどうかを知りたいと思います。

メモリには、長さ10000のバッファが10個、またはキャッシュとして機能する10xNイメージバッファが作成されます。

最初のカーネルは、キャッシュ内の行を埋め、別のカーネルにクエリを実行して、その行でいくつかの作業を実行します。2番目のカーネルが完了すると、最初のカーネルは新しい行を計算して古い行を置き換えることができ、最初のカーネルにタスクがなくなるまで同じ手順が続行されます。

シナリオは理にかなっており、GPUプログラミング内で可能ですか?

4

1 に答える 1

1

OpenCLは、カーネルが他のカーネルを呼び出すことを許可しません。しかし、いくつかのオプションがあります。

  1. 最初のカーネルに別の非カーネル関数を呼び出させます。ここでは、作業項目間の作業分散は変更されません。したがって、各行に1つずつ、合計10の並列作業項目(スレッド)が実行されている場合、各スレッドは非カーネル関数の同じデータで動作します。

  2. 複数のカーネルを次々にエンキューすることができますが、これはホストによって調整されます。これにより、スレッド間で作業を再分散できますが、オプション1よりも複雑になる可能性があります。

高速なOpenCLコードを作成するための鍵の1つは、作業を作業項目に分割することです。行を埋める最初のカーネルは10個の作業項目にしか分割できないが、この行で処理を行う2番目のカーネルは1000個の作業項目に分割できる場合は、2番目の部分としてオプション2を使用する必要があります。最新のGPUなど、コア数が多いデバイスでより効率的に分割できます。10などの少数の作業項目では、この利用可能な処理能力のごく一部しか使用できません。

(追加)

GPUで実行されるOpenCLカーネルはデータ並列です。つまり、一度に実行できるカーネルは1つだけですが、各スレッドは異なるデータで動作します。このモデルに適合するようにアルゴリズムを再考する価値があるかもしれません。

コメントに書いたことから、メモリの制約のために一度に10個のアイテムを実行したいようです。ただし、OpenCLには動的メモリ割り当てがないことに注意してください。すべてのバッファは事前に宣言されます。したがって、ホストは、使用可能なメモリに収まるタスクの数を決定し、(バッファーを適切に転送して)作業項目のバッチを実行する必要があります。

また、バッファはどのように埋められていますか?ファイルから?OpenCLカーネルはファイルやネットワークなどを読み取ることができないため、これが元のデータのロード方法である場合は、ホストで実行する必要があります。ただし、これらの画像バッファが他のソースから(たとえば、アルゴリズムまたは別のメモリ内ソースから)作成されている場合は、問題なく機能するはずです(ただし、他のメモリ内ソースもGPUにコピーする必要があります)。 。

于 2012-06-21T01:30:28.340 に答える