164

I have been using CUDA for a few weeks, but I have some doubts about the allocation of blocks/warps/thread. I am studying the architecture from a didactic point of view (university project), so reaching peak performance is not my concern.

First of all, I would like to understand if I got these facts straight:

  1. The programmer writes a kernel, and organize its execution in a grid of thread blocks.

  2. Each block is assigned to a Streaming Multiprocessor (SM). Once assigned it cannot migrate to another SM.

  3. Each SM splits its own blocks into Warps (currently with a maximum size of 32 threads). All the threads in a warp executes concurrently on the resources of the SM.

  4. The actual execution of a thread is performed by the CUDA Cores contained in the SM. There is no specific mapping between threads and cores.

  5. If a warp contains 20 thread, but currently there are only 16 cores available, the warp will not run.

  6. On the other hand if a block contains 48 threads, it will be split into 2 warps and they will execute in parallel provided that enough memory is available.

  7. If a thread starts on a core, then it is stalled for memory access or for a long floating point operation, its execution could resume on a different core.

Are they correct?

Now, I have a GeForce 560 Ti so according to the specifications it is equipped with 8 SM, each containing 48 CUDA cores (384 cores in total).

My goal is to make sure that every core of the architecture executes the SAME instructions. Assuming that my code will not require more register than the ones available in each SM, I imagined different approaches:

  1. I create 8 blocks of 48 threads each, so that each SM has 1 block to execute. In this case will the 48 threads execute in parallel in the SM (exploiting all the 48 cores available for them)?

  2. Is there any difference if I launch 64 blocks of 6 threads? (Assuming that they will be mapped evenly among the SMs)

  3. If I "submerge" the GPU in scheduled work (creating 1024 blocks of 1024 thread each, for example) is it reasonable to assume that all the cores will be used at a certain point, and will perform the same computations (assuming that the threads never stall)?

  4. Is there any way to check these situations using the profiler?

  5. Is there any reference for this stuff? I read the CUDA Programming guide and the chapters dedicated to hardware architecture in "Programming Massively Parallel Processors" and "CUDA Application design and development"; but I could not get a precise answer.

4

2 に答える 2

139

最良のリファレンスの 2 つは次のとおりです。

  1. NVIDIA Fermi コンピューティング アーキテクチャ ホワイトペーパー
  2. GF104のレビュー

私はあなたの質問のそれぞれに答えようとします。

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

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

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

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

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

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

参考資料(数分)を読むと、あなたの目標が意味をなさないことがわかると思います。ご指摘の件、お答えしようと思います。

1' . kernel<<<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 の方が適切なターゲットです。

于 2012-05-06T01:21:17.657 に答える
9

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

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

ワープ自体はシングルコア(=マルチプロセッサ)でのみスケジュールでき、同時に最大32スレッドを実行できます。複数のコアを使用することはできません。

数値「48ワープ」は、Compute Capability2.xを備えたnVIDIAGPUでの、マルチプロセッサごとのアクティブなワープ(任意のサイクルで次のサイクルでの作業をスケジュールするために選択できるワープ)の最大数です。この数は1536=48x32スレッドに対応します。

このウェビナーに基づいて回答する

于 2012-10-25T12:02:40.567 に答える