NVIDIAは、(ローカル)ワークグループサイズを32の倍数にすることをお勧めします(1ワープに等しい、これは実行のアトミックユニットであり、32スレッド/ワークアイテムがアトミックに一緒にスケジュールされることを意味します)。一方、AMDは64の倍数(1つの波面に等しい)を推奨しています。Intelについてはよくわかりませんが、このタイプの情報はIntelのドキュメントに記載されています。
したがって、計算を行っていて、2300の作業項目(グローバルサイズ)があるとすると、2300は64または32で除算できません。ローカルサイズを指定しない場合、OpenCLは不適切なローカルサイズを選択します。 。アトミック実行単位の倍数であるローカルサイズがない場合は、アイドル状態のスレッドが発生し、デバイスの使用率が低下します。したがって、いくつかの「ダミー」スレッドを追加して、32/64の倍数であるグローバルサイズを取得し、次に32/64のローカルサイズを使用することが有益な場合があります(グローバルサイズはローカルサイズで除算可能である必要があります) )。2300の場合、2304は32で除算できるため、4つのダミースレッド/作業項目を追加できます。実際のカーネルでは、次のように記述できます。
int globalID = get_global_id(0);
if(globalID >= realNumberOfThreads)
globalID = 0;
これにより、4つの追加スレッドがスレッド0と同じように動作します(多くの場合、アイドル状態のスレッドを多数持つよりも、追加の作業を行う方が高速です)。
それがあなたの質問に答えたことを願っています。GL HF!