前の回答:いいえ、バッファーをまったくスワップする必要はありません。
ただし、提案された回答には同意しません。関数clSetKernelArg()
はスレッド セーフではなく、操作ループで呼び出されるように設計されていません。
適切な解決策は、同じプログラムとソースで作成された 2 つのカーネルを作成することです。このアプローチは、「1 つのタスクに 1 つのカーネル」という OpenCL プログラミングの哲学に沿ったものです。同じコードで引数が異なる多くのカーネルを使用するのが最善の方法です。
最初のカーネルには次のものがあります。
kernel1 = clCreateKernel(program, "mykernel", NULL);
clSetKernelArg(kernel1, 0, &buff1);
clSetKernelArg(kernel1, 1, &buff2);
もう1つは次のようになります。
kernel2 = clCreateKernel(program, "mykernel", NULL);
clSetKernelArg(kernel2, 0, &buff2);
clSetKernelArg(kernel2, 1, &buff1);
このように、反復ごとに実行を停止する必要はありません。あなたは単に実行することができます:
for(int it=0; it<iter; it++){
clEnqueueNDRangeKernel(it%2 ? kernel1 : kernel2, ....);
}
clFinish(command);
このアプローチは、カーネル引数を変更するよりも確実に優れており、より効率的で、API 呼び出しが少なくなります。さらに、一部のシステムでclSetKernelArgs()
は、API の実装が不十分なため、呼び出しがブロックされる場合があります。したがって、これらはできるだけ避けたほうがよいでしょう。