GPUの概要とCUDAツールキット
GPUアーキテクチャ
GPU(Graphics Processing Unit) は、コンピューターの処理のなかで、画像処理をすることを目的として開発された処理装置です。これまでの20年間は、高解像度3Dグラフィックスの需要によって普及してきました。 非常に多くの画素(ピクセル:Pixel)を高速で処理するため、GPUは巨大な計算能力とメモリ帯域幅を備えた超並列プロセッサに進化してきました。
GPUは同じ価格と電力範囲内で比較すると、CPUよりもはるかに高い命令スループットとメモリ帯域幅を提供します。
CPUは、スレッドと呼ばれる一連の操作を可能な限り高速に実行するように設計されており、これらのスレッドを数十個並列で実行できるように設計されていますが、GPUは、数千個のスレッドを並列で実行するように設計されています。
GPUは高度な並列計算に特化しているため、データキャッシングやフロー制御ではなく、より多くのトランジスタがデータ処理に専念するように設計されています。
https://gyazo.com/b22a2b17b162e145383b23b3232432bc
Fig.1 CPUとGPUの回路図の概要
DRAMはメモリです。 CPUには少数のコアしかなく、CPUの大部分はフロー制御とデータキャッシング(L1, L2, L3Cache)に専念しています。 GPUには、並行して動作する多数のコアがあります。 コアはマルチプロセッサに配置され、それぞれに単純なフロー制御と少量のキャッシュがあります。
多くの場合、GPUのクロック速度は、CPUよりも低くいものです。しかし、はるかに上回る多数のコアによって補われます。
table: CPUとGPUの比較
ベースクロック コア数
Tesla V100 GPU 1.45 GHz 5120
Intel Core i9-9900K 3.6 GHz 8
GPUの強力なパワーを活用するには、新しいプログラミングパラダイムが必要になります。CPUは複雑な処理を行うことができますが、GPUでは単純な処理しかできないため、データのごく一部のみを処理する単純なタスクに分割する必要があります。 しかし、このタスクを大量に並列実行することができます。
GPUハードウェア
2021年1月時点で、GoogleColab の無料で利用できるGPUは、Tesla T4 です。 NVIDIAの資料 によれば、Tesla T4 は Turing TU102GPUに基づいていることがわかります。 72のストリーミングマルチプロセッサ
ストリーミングマルチプロセッサあたり64個のCUDAコア
https://gyazo.com/d1a4a92dc9ca27a03f3a7b6a8fd597fd
Fig.1 TU102GPUのブロック図
ストリーミングマルチプロセッサ
ストリーミングマルチプロセッサ(SM: Streaming Multiprocessor) は、CUDA対応GPUの基本的な処理ユニットです。 各SMはは、多數のストリーミングプロセッサ(SP: Streaming Processor) と同一のSMからしかアクセスできない共有メモリ(Shared Memory)と、それぞれのSPのローカルメモリとして利用される高速なレジスタを持っています。各SMはこれらを使って数百のスレッドを並行して実行できます。
ブロック数とブロックあたりのスレッド数
カーネルが起動されると、スレッドの各ブロックが単一のSMに送信され、各SMは最終的に複数のブロックで処理される可能性があります。
ブロックの数がGPU内のSMの数よりも少ない場合、一部のSMはアイドル状態になります。上記の最初の簡単な例では32ブロックを使用します。TeslaT4には72個のSMがあるので、40のSMは未使用のままとなります。
ブロックを処理するために、SMはそれをワープ(warps)と呼ばれる32スレッドのグループに分割します。ワープは、ワープ内のすべてのスレッドに対して、指定された時間に1つの共通命令を並行して実行します。したがって、ブロック内のすべてのワープが完了すると、ブロックの性能がフルに発揮されます。つまり、ブロックあたりのスレッド数は32の倍数である必要があります。さらに、待ち時間を少なくするために、この数は小すぎないようにする必要があります。
実行構成を決定するのは簡単ではありません。パフォーマンス分析に基づいて行う必要があります。ただし、開始するための基本的なルールは次のとおりです。
ルール1:
グリッド内のブロックの数は、GPU上のSMの数よりも大きくする必要がある(通常は2〜4倍)
ルール2:
ブロックあたりのスレッド数は32の倍数にする (通常は128から512の間)
TeslaT4には72のSMがあります。18432(72 x 2 x 128)より大きいサイズのデータ配列で最高のパフォーマンスを発揮します。これは最低限のことで、通常は、それよりはるかに大きい配列で使用されます。
一方、データ配列が非常に大きい場合を考えてみましょう。例えば、仮に10億のエントリを持つ配列を考えてみましょう。上記のルール2に従って、256のブロックあたりのスレッド数を選択でき、最終的に約300万(1e9 / 256)ブロックになります。 CUDAカーネルの起動オーバーヘッドはブロック数とともに増加するため、このような多数のブロックを使用するとパフォーマンスが低下してしまいます。
CUDAツールキット
CUDAはCompute Unified Device Architectureの略で、NVIDIA社の登録商標です。
NVIDIA®CUDA®ツールキット は、高性能のGPUアクセラレーションアプリケーションを作成するための開発環境を提供します。 CUDAツールキットを使用すると、GPUで高速化された組み込みシステム、デスクトップワークステーション、エンタープライズデータセンター、クラウドベースのプラットフォーム、およびHPCスーパーコンピューターでアプリケーションを開発、最適化、および展開できます。 このツールキットには、GPUアクセラレーションライブラリ、デバッグおよび最適化ツール、C/C++コンパイラ、およびx86、Arm、POWERなどの主要なアーキテクチャでアプリケーションを構築およびデプロイするためのランタイムライブラリが含まれています。 CUDAでは、最大65535 x 65535 x 512個のスレッドを並列に実行することができます。GPUのSP数はこれよりずっと少ないのですが、内部で自動的にスケジューリングされて処理されます。
この膨大なスレッドを管理するためにブロック(block) と グリッド(grid) が使用されます。
スレッド(Thread):処理される1つのタスク
ブロック(block):スレッドの3次元構造
1ブロック中に最大数512のスレッドを保持
グリッド(grid):ブロックの2次元構造
グリッド中のブロックの各軸方向の最大数は65535.
CUDAで使用される用語
頻繁に使用されるCUDAでの用語を明確にしておきましょう。
table: CUDAで使用される用語
用語 解説
ホスト CPU/GPUを搭載したシステム
ホストメモリ CPU側のメモリ
デバイス ホストに搭載されているGPU
デバイスメモリ GPU側のメモリ
カーネル GPUの並列処理を記述する関数