- GPUコンピューティングの基本的な理解は、すべてのソフトウェアエンジニアにとって必須である
- この記事は主にNvidia GPUに焦点を当てており、Nvidiaの用語を使用している
- GPUは、グラフィックス、数値計算、ディープラーニングなどにおける大規模並列処理と高スループットのために設計されている
CPUとGPUの比較
- CPUは逐次的な命令実行のために設計されており、命令実行レイテンシを減らすためのさまざまな機能が含まれている。
- GPUは大規模並列処理と高スループットのために設計されており、中程度から高い命令実行レイテンシを持つ。
- GPUはCPUよりはるかに多くの演算を、はるかに高速に処理できる。
# GPUアーキテクチャ
GPUコンピュートアーキテクチャ
- GPUはストリーミングマルチプロセッサ(SM)の配列で構成されている。
- 各SMは複数のストリーミングプロセッサ(コアまたはスレッド)を含む。
- SMは限られた量のオンチップメモリ(共有メモリまたはスクラッチパッド)を持ち、すべてのコアで共有される。
GPUメモリアーキテクチャ
- GPUは複数階層のさまざまな種類のメモリを備えている。
- 各SMは大量のレジスタを持ち、これはコア間で共有される。
- 定数キャッシュは、コード実行に使用される定数データをキャッシュするために使われる。
- 共有メモリは高速かつ低レイテンシなオンチップのプログラマブルSRAMメモリである。
- L1キャッシュは、L2キャッシュから頻繁にアクセスされるデータをキャッシュする。
- L2キャッシュはすべてのSMで共有され、グローバルメモリから頻繁にアクセスされるデータをキャッシュする。
- グローバルメモリは大容量・高帯域幅のDRAMであり、SMから離れているためレイテンシが高い。
# GPU実行モデルの理解
CUDAカーネルとスレッドブロックの簡単な紹介
- CUDAはNvidia GPU向けのプログラムを書くためのプログラミングインターフェースである。
- カーネルは、GPU上で並列に実行されるC/C++関数に似た形で表現される計算である。
- カーネル実行のために、グリッドと呼ばれるスレッドの集合を起動する。
GPUでのカーネル実行の段階
- ホストからデバイスへデータをコピー
- SMへスレッドブロックをスケジューリング
- 単一命令・複数スレッド(SIMT)とワープ
- ワープスケジューリングとレイテンシ隠蔽
- 結果データをデバイスからホストメモリへコピー
# 資源分割と占有率の概念
- GPUリソースの活用度は「占有率」という指標で測定され、SMがサポートできる最大ワープ数に対する、割り当てられたワープ数の比率を表す。
- 占有率は、SMの実行リソース、レジスタ、共有メモリ、スレッドブロックスロット、スレッドスロットによって制限される。
- 高い占有率を維持しつつ、コード最適化によってレイテンシを最小化することが重要である。
# 要約
- GPUは複数のSMで構成され、各SMは複数の処理コアを持つ。
- グローバルメモリはチップから離れており、レイテンシが高い。
- L1およびL2キャッシュは、CPUのL1/L2キャッシュと同様に動作する。
- 各SMには共有メモリがあり、これはコア間で共有される。
- GPUでカーネルを実行するには、スレッドのグリッドを起動する。
- GPUはSMで実行するブロックを割り当て、すべてのスレッドは同じSM上で実行される。
- SMに割り当てられたスレッドは、ワープと呼ばれる32単位のグループにさらにまとめられる。
- GPUはスレッドの要件とSMの制約に応じて、スレッド間で動的なリソース分割を行う。
# 締めくくり
- GPUは今日広く使われており、そのアーキテクチャと実行モデルはCPUとは根本的に異なる。
- この記事はGPUのさまざまな側面を扱い、GPUが広く使われる理由とその動作方法についての洞察を提供する。
GN⁺の意見
- GPUはディープラーニングや複雑な数値計算に不可欠な技術であり、この記事はGPUの基本的なアーキテクチャと実行モデルを理解するのに役立つ。
- 並列処理や高性能コンピューティングに関心のある初級ソフトウェアエンジニアにとって、特に重要な内容を含んでいる。
- この記事はGPUプログラミングに関する基礎知識を提供し、この分野への好奇心を刺激する興味深い資料である。
1件のコメント
Hacker Newsの意見