章7 GPUメモリアクセスパターンのプロファイリングと チューニング
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
AIモデルの規模と複雑さが増すにつれ、GPUのメモリシステムは理論上の演算能力と実世界性能の間に立ちはだかるボトルネックとなることが多い。第6章で見たように、現代のNVIDIA GPUは、スループット最適化された数千の単純なコアと、専用のTensorコアを組み合わせている。また、高帯域幅メモリ(HBM)、CPUとGPUを統合した一貫性のあるメモリアドレス空間(例:Grace Blackwell Superchip)、オンチップ共有メモリ、キャッシュ、Tensor Memory Accelerator(TMA)のような専用のダイレクトメモリアクセス(DMA)エンジンも備えている。
本章では、効率的なメモリアクセスに向けたデータ構造の調整、冗長なデータのロードの排除、ハードウェアを利用したデータ転送と演算のオーバーラップを実現する、様々なCUDA C++およびPyTorchの最適化テクニックを学ぶ。
行列乗算やテンソル演算などの具体的な最適化前後の例を通じて、メモリアクセスパターン、タイリング戦略、非同期データ転送における小さな変更が、無駄な帯域幅を削減し、演算効率性を向上させ、カーネルをメモリ制約から演算制約へと変換する様子を確認できる。
この章の終わりまでに、GPUのメモリ階層とハードウェア最適化データ転送エンジンをより効果的に活用するCUDAカーネルを書き方を理解できるようになる。
結合型と非結合型のグローバルメモリアクセス
コードのメモリアクセスパターンは は、パフォーマンスに大きく影響する。グローバルメモリアクセスは、ワープ内のスレッドが連続メモリのメモリアドレスにアクセスし、ハードウェアがそれをより少ない大規模なトランザクションに統合できる場合に最速となる。スレッドが分散したアドレスやアライメントがずれたアドレスにアクセスすると、デバイスはリクエストを最小限のキャッシュライントランザクションに統合できない(現代のGPUでは4つの32バイトセクタで構成される128バイト行)。その結果、未使用データを検索するメモリトランザクションが大幅に増加し、メモリ帯域幅を急速に消費する。
Blackwell GPUでは、デバイスあたりのHBM3e帯域幅は最大8TB/sである。Grace BlackwellのGB200およびGB300(2つのGPUスーパーチップ)内では、両GPU合計で16TB/sに増加する。結合されていないメモリアクセスを使用すると、過剰なメモリトランザクションとストールにより、この帯域幅の大部分が未使用のままとなる。
非結合の場合、ワープ内の各スレッドは分散したアドレスから読み込む。これにより多数の独立したメモリトランザクションが発生する。ワープ内のスレッドが連続したアドレスにアクセスする場合でも、最初のアドレスが128バイトアラインされていないと、ワープのリクエストは2つの128バイトキャッシュ行にまたがる。
例えば、ワープの最初のスレッドが128バイトアラインされていないアドレスから開始する場合、ワープのメモリリクエストはキャッシュライン境界を越える。その結果、1回のトランザクションではなく、しばしば2回の128バイトトランザクションが発生する。この場合、ワープは最適な4セクタを超えて余分なセクタをフェッチし、2つの行にまたがる合計5セクタとなる。これは帯域幅の無駄である。アラインメントがずれた連続した128バイトのワープロードが5×32バイトセクタにアクセスするか、8×32バイトセクタにアクセスするかは、開始オフセットに依存する。アラインメントが取れたアクセスでは4×32バイトセクタに収まる。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access