4

OpenCL でさまざまなデバイスに最適なローカルおよびグローバル ワーク サイズを選択する方法を知りたいですか? AMD、NVIDIA、INTEL GPU の普遍的な規則はありますか? デバイスの物理的なビルド (マルチプロセッサの数、マルチプロセッサ内のストリーミング プロセッサの数など) を分析する必要がありますか?

アルゴリズム/実装に依存しますか? 一部のライブラリ (ViennaCL など) が正しい値を評価するために、ローカル/グローバル作業サイズの多くの組み合わせをテストし、最適な組み合わせを選択するだけであることがわかりました。

4

2 に答える 2

12

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!

于 2013-01-11T10:25:27.577 に答える
1

基本的に少量のメモリを使用して処理を行っている場合 (たとえば、カーネルのプライベート ステートを格納するため)、問題に対して最も直感的なグローバル サイズを選択し、OpenCL にローカル サイズを選択させることができます。

ここで私の答えを見てください:https://stackoverflow.com/a/13762847/145757

メモリ管理がアルゴリズムの中心部分であり、パフォーマンスに大きな影響を与える場合は、実際にはもう少し進んで、最初にclGetKernelWorkGroupInfoを使用して最大ローカル サイズ(カーネルのローカル/プライベート メモリの使用量に依存) を確認する必要があります。それ自体があなたのグローバルサイズを決定します。

于 2013-01-10T12:12:53.280 に答える