実行中に異なるワーク グループを同期することはできません。
計算ユニットは通常、タスクを同期するために通信できるプロセッサのグループです。たとえば、Nvidia コンピューティング ユニット (ストリーミング マルチプロセッサ) には 8 つのストリーミング プロセッサがあり、この特定のコンピューティング ユニットで実行されているタスクを同期することしかできません。
あなたが言及したオーバーヘッドが本当にあるかどうか、私は最初に見つけようとします:
同期がどのように機能し、複数のカーネルを単純にエンキューするのにどれだけ効率的かは、使用しているシステムによって異なります。CPU は、GPU メモリなどに転送する必要がないため、多くの異なるカーネルを処理するのに非常に優れています。
ベンチマークを行うことをお勧めします。OpenCL は強力なプロファイリング機能を提供します。CL_QUEUE_PROFILING_ENABLE でキューを初期化する必要があります。その後、たとえば次のように各イベント オブジェクトのプロファイリング情報を出力できます (私は C++ バインディングを使用しています)。
std::vector<cl::Event> evts;
//[Create some event objects by enqueueing and executing kernels]
for (unsigned int i=0; i<evts.size(); i++) {
evts[i].getProfilingInfo(CL_PROFILING_COMMAND_QUEUED, ¶m);
printf("%u: %llu", i, param);
evts[i].getProfilingInfo(CL_PROFILING_COMMAND_SUBMIT, ¶m);
printf(" %llu", param);
evts[i].getProfilingInfo(CL_PROFILING_COMMAND_START, ¶m);
printf(" %llu", param);
evts[i].getProfilingInfo(CL_PROFILING_COMMAND_END, ¶m);
printf(" %llu\n", param);
}