並列 GPU コード (OpenACC で記述) の強力なスケーリングを調査したいと思います。GPU によるストロング スケーリングの概念は、少なくとも私の知る限りでは、CPU よりも曖昧です。GPU での強力なスケーリングに関して私が見つけた唯一のリソースは、問題のサイズを修正し、GPU の数を増やすことを提案しています。ただし、ストリーミング マルチプロセッサ (Nvidia Kepler アーキテクチャ) のスケーリングなど、GPU内にはある程度の強力なスケーリングがあると思います。
OpenACC と CUDA の目的は、ハードウェアを並列プログラマーに明示的に抽象化し、並列プログラマーをギャング (スレッド ブロック)、ワーカー (ワープ)、ベクトル (スレッドの SIMT グループ) による 3 レベルのプログラミング モデルに制約することです。CUDA モデルは、独立しており、SMX にマップされているスレッド ブロックに関してスケーラビリティを提供することを目的としていると理解しています。したがって、GPU を使用したストロング スケーリングを調査するには、次の 2 つの方法があります。
- 問題のサイズを修正し、スレッド ブロック サイズとブロックあたりのスレッド数を任意の定数に設定します。スレッド ブロックの数 (グリッド サイズ) をスケーリングします。
- 基礎となるハードウェアに関する追加の知識 (例: CUDA 計算機能、最大ワープ/マルチプロセッサ、最大スレッド ブロック/マルチプロセッサなど) を考慮して、ブロックが全体および単一の SMX を占有するように、スレッド ブロック サイズとブロックあたりのスレッド数を設定します。したがって、スレッド ブロックのスケーリングは、SMX のスケーリングと同じです。
私の質問は次のとおりです: GPU での強力なスケーリングに関する私の一連の考えは正しいですか? もしそうなら、OpenACC 内で上記の #2 を行う方法はありますか?