OpenCLは、カーネルが他のカーネルを呼び出すことを許可しません。しかし、いくつかのオプションがあります。
最初のカーネルに別の非カーネル関数を呼び出させます。ここでは、作業項目間の作業分散は変更されません。したがって、各行に1つずつ、合計10の並列作業項目(スレッド)が実行されている場合、各スレッドは非カーネル関数の同じデータで動作します。
複数のカーネルを次々にエンキューすることができますが、これはホストによって調整されます。これにより、スレッド間で作業を再分散できますが、オプション1よりも複雑になる可能性があります。
高速なOpenCLコードを作成するための鍵の1つは、作業を作業項目に分割することです。行を埋める最初のカーネルは10個の作業項目にしか分割できないが、この行で処理を行う2番目のカーネルは1000個の作業項目に分割できる場合は、2番目の部分としてオプション2を使用する必要があります。最新のGPUなど、コア数が多いデバイスでより効率的に分割できます。10などの少数の作業項目では、この利用可能な処理能力のごく一部しか使用できません。
(追加)
GPUで実行されるOpenCLカーネルはデータ並列です。つまり、一度に実行できるカーネルは1つだけですが、各スレッドは異なるデータで動作します。このモデルに適合するようにアルゴリズムを再考する価値があるかもしれません。
コメントに書いたことから、メモリの制約のために一度に10個のアイテムを実行したいようです。ただし、OpenCLには動的メモリ割り当てがないことに注意してください。すべてのバッファは事前に宣言されます。したがって、ホストは、使用可能なメモリに収まるタスクの数を決定し、(バッファーを適切に転送して)作業項目のバッチを実行する必要があります。
また、バッファはどのように埋められていますか?ファイルから?OpenCLカーネルはファイルやネットワークなどを読み取ることができないため、これが元のデータのロード方法である場合は、ホストで実行する必要があります。ただし、これらの画像バッファが他のソースから(たとえば、アルゴリズムまたは別のメモリ内ソースから)作成されている場合は、問題なく機能するはずです(ただし、他のメモリ内ソースもGPUにコピーする必要があります)。 。