dskjal
広告
広告

CUDA 用語のまとめ

カテゴリ:others

CUDA は1コア1スレッドごとに制御できない。Streaming Multiprocessor に対し Thread Block を割り付けるのが制御の最小単位だ。そして SM 内で Thread Block は Warp 単位に分割され、実行される。なのでスレッドブロックと Warp との対応を理解していないと思った通りのパフォーマンスが出せない。

ハードウェアの概念

CUDA Core

Streaming Processor と呼ばれることもある。スレッドを実行する。明示的なスレッド割り付け制御はできない。

Streaming Multiprocessor(SM)

CUDA Core をまとめたもの。SM 内に CUDA Core がいくつあるかは GPU によって異なる。

SM には制約がある。Ada Lovelace 世代では以下の2つの制約がある。

  1. キューイングできる Warp 数の上限が 48
  2. 割り付けられる Thread Block 数の上限が 24

SM のリソースに余裕があれば、複数の Thread Block を同時に実行できる。上記の場合、Thread Block のスレッド数が 768 の Thread Block は2つ同時に実行できる。Thread Block は全てのスレッドの実行が完了するまでリソースを解放しないことに注意が必要。

Warp

スレッドをまとめたもの。1Warp = 32 スレッド。

Warp 内のスレッドは同じ命令を実行する。しかし CUDA Core ごとに命令カウンタとレジスタステートを保持しているので分岐実行が可能。ただし Warp 内で同じ命令を実行する必要があるため、分岐実行は以下のようになる。

  1. 片方のパスを実行している間、もう片方のパスのスレッドを停止させる
  2. 実行したパスのスレッドを停止させ、停止させていた方のスレッドを実行する
  3. 停止していたスレッドを起こして、実行を再開する

Occupancy

Warp で測った SM の使用率。たとえば Ada Lovelace 世代では 48 Warp キューイングできる。このとき 192 スレッドの Thread Block を8個 SM に割り付けると、1,536 / 32 = 48 で Occupancy は 100% になる。Ada Lovelace 世代では割り付けられる Thread Block 数の上限が 24なので、48 スレッドの Thread Block を 32 個割り付けることはできない。余った Thread Block は別の SM に割り付けられる。24 の Thread Block を割り付けた SM の Occupancy は 75% になる。

Occupancy は 100% にすれば速いわけではない。たいていの GPU で Occupancy 50% 程度でスループットが頭打ちになる。これはレジスタが不足するために起こる。

ソフトウェアの概念

Kernel

CUDA Core で実行する関数。

Thread Block

単一 SM 上で実行されるスレッドをまとめたもの。上限はデバイスごとに異なり、512・1,024・2,048スレッド。Thread Block はほかの Thread Block と独立している必要がある。なので Thread Block を跨いだ処理はできない。

Thread Block のスレッド数が Warp のスレッド単位で割り切れない場合は、何もしないスレッドを割り付けて数を調整する。

Thread Block あたりのスレッド数は大きい方がいい。

Thread Block あたりのスレッド数が 64 の倍数の時、最も効率的になる。

Grid

Thread Block をまとめたもの。Global Memory を経由してほかの Grid の計算結果を参照する場合は、Grid 単位に行う必要がある。

メモリ

Register

スレッドごとに割り当てられる、コンパイラが管理するレジスタ。

Ada Lovelace 世代では以下のようなスペックになっている

Thread Block あたりのスレッド数が 64 の倍数の時、最も効率的になる。

Local Storage

スレッドごとに割り当てられる、コンパイラが管理するメモリ。レジスタが不足する場合に使われる。DRAM 上に配置されるため、レイテンシは大きく、スループットも低い。

Shared Memory

スレッドブロックごとに割り当てられる。レイテンシは小さく(数サイクル)、スループットが大きい。

Ada Lovelace 世代では以下のようなスペックになっている

Global Memory(GDDR や HBM)

CPU や全スレッドからアクセス可能。レイテンシは大きく、スループットも低い。

外部リンク

NVIDIA GPU の構造と CUDA スレッディングモデル

CUDA C++ Programming Guide

Using CUDA Warp-Level Primitives

Profiler User’s Guide

Thread block (CUDA programming))

NVIDIA GPU ARCHITECTURE & CUDA PROGRAMMING ENVIRONMENT


広告
広告

カテゴリ