CUDAブロック/ワープ/スレッドはどのようにCUDAコアにマッピングしますか?


142

私は数週間CUDAを使用していますが、ブロック/ワープ/スレッドの割り当てに疑問があります。 私は教訓的な観点から大学を研究しているので(大学のプロジェクト)、ピークパフォーマンスに到達することは私の関心事ではありません。

まず最初に、これらの事実を正直に理解したかどうかを理解したいと思います。

  1. プログラマーはカーネルを作成し、その実行をスレッドブロックのグリッドに編成します。

  2. 各ブロックは、ストリーミングマルチプロセッサ(SM)に割り当てられます。いったん割り当てられると、別のSMに移行できません。

  3. 各SMは独自のブロックをワープに分割します(現在、最大サイズは32スレッドです)。ワープ内のすべてのスレッドは、SMのリソース上で同時に実行されます。

  4. スレッドの実際の実行は、SMに含まれるCUDAコアによって実行されます。スレッドとコアの間に特定のマッピングはありません。

  5. ワープに20スレッドが含まれているが、現在は16コアしか使用できない場合、ワープは実行されません。

  6. 一方、ブロックに48個のスレッドが含まれている場合、十分なメモリが利用可能であれば、2つのワープに分割され、並列に実行されます。

  7. スレッドがコアで開始されると、メモリアクセスまたは長い浮動小数点演算のためにスレッドが停止し、別のコアで実行が再開される可能性があります。

彼らは正しいですか?

現在、私はGeForce 560 Tiを持っているので、仕様によると、それぞれに48個のCUDAコア(合計384個のコア)を含む8つのSMが搭載されています。

私の目標は、アーキテクチャのすべてのコアが同じ命令を実行することを確認することです。私のコードが各SMで利用可能なものよりも多くのレジスターを必要としないと仮定して、私は異なるアプローチを想像しました:

  1. 各SMが実行する1つのブロックを持つように、それぞれ48スレッドの8ブロックを作成します。この場合、48スレッドはSMで並列に実行されますか(それらに使用可能な48コアすべてを利用します)?

  2. 6スレッドの64ブロックを起動しても違いはありますか?(それらがSM間で均等にマッピングされると仮定)

  3. スケジュールされた作業でGPUを「サブマージ」する場合(たとえば、1024スレッドの1024ブロックを作成する場合)、すべてのコアが特定の時点で使用され、同じ計算を実行すると想定するのが妥当です(スレッドがストールしないでください)?

  4. プロファイラーを使用してこれらの状況を確認する方法はありますか?

  5. このものへの参照はありますか?「大規模並列プロセッサのプログラミング」と「CUDAアプリケーションの設計と開発」で、CUDAプログラミングガイドとハードウェアアーキテクチャ専用の章を読みました。正確な答えは得られませんでした。


「CUDAコア」とは何かをコメントとして追加したいと思います。「CUDAコア」または「実行ユニット」は、完全にパイプライン化された整数ALUおよびFPUであり、1つのcudaスレッドでクロックサイクルごとに1つの算術命令命令を実行します。
bruziuz

回答:


123

最高のリファレンスの2つは

  1. NVIDIA Fermi計算アーキテクチャホワイトペーパー
  2. GF104レビュー

それぞれの質問にお答えします。

プログラマーは作業をスレッドに、スレッドをスレッドブロックに、スレッドブロックをグリッドに分割します。コンピューティングワークディストリビューターは、スレッドブロックをストリーミングマルチプロセッサ(SM)に割り当てます。スレッドブロックがSMに配布されると、スレッドブロックのリソースが割り当てられ(ワープと共有メモリ)、スレッドはワープと呼ばれる32スレッドのグループに分割されます。ワープが割り当てられると、アクティブなワープと呼ばれます。2つのワープスケジューラは、サイクルごとに2つのアクティブなワープを選択し、ワープを実行ユニットにディスパッチします。実行ユニットと命令ディスパッチの詳細については、1 p.7-10および2を参照してください。

4 '。レーン(ワープのスレッドインデックス)とコアの間にマッピングがあります。

5 '。ワープに含まれるスレッドが32未満の場合、ワープは通常、32スレッドの場合と同じように実行されます。ワープは、いくつかの理由で32未満のアクティブスレッドを持つことができます。ブロックあたりのスレッド数が32で割り切れない、プログラムが分岐ブロックを実行するため、現在のパスをとらなかったスレッドは非アクティブとしてマークされるか、ワープ内のスレッドが終了します。

6 '。スレッドブロックはWarpsPerBlock =(ThreadsPerBlock + WarpSize-1)/ WarpSizeに分割されます。ワープスケジューラが同じスレッドブロックから2つのワープを選択する必要はありません。

7 '。実行ユニットはメモリ操作で停止しません。命令をディスパッチする準備ができているときにリソースが使用できない場合、リソースが使用可能になると、命令は将来再びディスパッチされます。ワープは、バリア、メモリ操作、テクスチャ操作、データ依存関係などで停止する可能性があります。停止したワープは、ワープスケジューラによる選択の対象にはなりません。フェルミでは、ワープスケジューラが命令を発行できるように、サイクルごとに少なくとも2つの適格なワープがあると便利です。

GTX480とGTX560の違いについては、リファレンス2を参照してください。

参考資料(数分)を読めば、あなたの目標が意味をなさないことに気付くでしょう。私はあなたのポイントに応えようとします。

1 '。カーネル<<< 8、48 >>>を起動すると、32および16スレッドの2つのワープを持つ8つのブロックがそれぞれ取得されます。これらの8つのブロックが異なるSMに割り当てられる保証はありません。SMに2つのブロックが割り当てられている場合、各ワープスケジューラがワープを選択してワープを実行できる可能性があります。48コアのうち32コアのみを使用します。

2 '。48スレッドの8ブロックと6スレッドの64ブロックには大きな違いがあります。カーネルに相違がなく、各スレッドが10の命令を実行するとします。

  • 48スレッドの8ブロック= 16ワープ* 10命令= 160命令
  • 6スレッドの64ブロック= 64ワープ* 10命令= 640命令

最適な効率を得るには、作業の分割を32スレッドの倍数にする必要があります。ハードウェアは、異なるワープからのスレッドを合体させません。

3 '。GTX560は、一度に8 SM * 8ブロック= 64ブロック、またはカーネルがレジスタまたは共有メモリを最大化しない場合、8 SM * 48ワープ= 512ワープを持つことができます。常に、作業の一部がSMでアクティブになります。各SMには複数の実行ユニットがあります(CUDAコア以外)。常にどのリソースが使用されているかは、アプリケーションのワープスケジューラと命令の組み合わせによって異なります。TEX操作を行わない場合、TEXユニットはアイドル状態になります。特別な浮動小数点演算を行わないと、SUFUユニットはアイドル状態になります。

4 '。Parallel NsightとVisual Profilerショー

a。実行されたIPC

b。発行されたIPC

c。アクティブサイクルごとのアクティブワープ

d。アクティブサイクルあたりの適格なワープ(Nsightのみ)

e。ワープストールの理由(Nsightのみ)

f。実行された命令ごとのアクティブなスレッド

プロファイラーには、実行ユニットの使用率は表示されません。GTX560の場合、概算はIssuedIPC / MaxIPCになります。MaxIPCの場合、GF100(GTX480)は2であると仮定します。GF10x(GTX560)は4ですが、ターゲットは3の方が適切です。


1
お返事ありがとうございます。私は参考文献を読みましたが、あなたの答えでは理解できないことがいくつかあります。次の質問では、48コア(16コア* 3 "コアグループ")のFermiアーキテクチャを使用していると想定しています。1.コアとレーン間のマッピングについて説明しました。それはどのようなマッピングですか?2.参照から、各「コアグループ」は、クロックサイクルあたり最大でハーフワープ(16スレッド)を実行することがわかりました。したがって、理論的には、同じブロックに48のスレッドがある場合、それらは3つのハーフワープに編成され、48コアで並列に実行されます。私は正しいですか?
Daedalus

1
CUDAコアは、単精度FPユニットの数です。CUDAコアの観点から実行を考えるのは正しくありません。各ワープには32スレッドがあります。これらのスレッドは、実行ユニットのグループ(16 cudaコアなど)に発行されます。1つのクロックで48コアすべてに発行するには、2つのワープスケジューラのいずれかがスーパースカラーペアの要件を満たすワープを選択し、両方の命令がCUDAコアによって実行されるタイプである必要があります。さらに、他のワープスケジューラは、次の命令がCUDAコアによって実行されるワープを選択する必要があります。
グレッグ・スミス

1
ワープが同じブロック内にある、またはブロック内のワープが同じプログラムカウンターを持っているという要件はありません。
グレッグ・スミス

2
あなたの例では、各スケジューラがワープを選択し、1つの命令を発行しています。この場合、実行ユニットの2つのグループのみが使用されます。より多くの実行ユニットを使用するために、スケジューラーの1つは二重発行する必要があります。参考文献に示されているように、複数のタイプの実行ユニット(造語されたcudaコアだけでなく)があり、スケジューラが二重発行されるために満たす必要のある命令ペアリングルール(十分に文書化されていません)があります。
グレッグ・スミス

1
@GregSmith私はウェブ全体を検索して、フェルミアーキテクチャのSMあたりのこの8つのアクティブなブロックがどこから来ているのかを調べています。それはフェルミのホワイトペーパーでさえ言及されていません。それについてもう少し言及がありますか?
Greg K.

8

「E.ワープに20スレッドが含まれているが、現在は16コアしか使用できない場合、ワープは実行されません。」

間違っています。通常の意味でのコアを混乱させています(CPUでも使用されます)-nVIDIAマーケティングのコアでのGPU内の「マルチプロセッサ」の数(「私たちのカードには数千のCUDAコアがある」)。

ワープ自体は、単一コア(=マルチプロセッサ)でのみスケジュールでき、同時に最大32スレッドを実行できます。単一のコアしか使用できません。

「48ワープ」という数値は、マルチプロセッサあたりのCompute Capability 2.xを搭載したnVIDIA GPU上のアクティブワープ(次のサイクルで、特定のサイクルで作業するように選択できるワープ)の最大数です。この数は、1536 = 48 x 32スレッドに対応します。

このウェビナーに基づく回答


@GregSmith:これに対処するために回答を編集しました。あなたがそれを我慢していたのは結構です、しかし-それは5年になります...
einpoklum

シングルコア(=マルチプロセッサ)?質問では、マルチコアではなく、シングルコア=プロセッサという用語を想定しています。あなたの専門用語であなたの答えは正しいです。
Adarsh 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.