ROCmとHIPプログラミング入門:実践的なチュートリアル
ROCmとHIPによるAMD GPUプログラミングの実践的で現代的なガイド。ソフトウェアスタック全体、インストール、ビルドワークフロー、カーネルプログラミング、メモリ管理、パフォーマンス最適化、ライブラリの使用、CUDAへの移行、そして本番環境でのデバッグ手法をカバーしています。
コース概要
📚 コンテンツ概要
ROCmとHIPを用いた実践的で現代的なAMD GPUプログラミングガイド。ソフトウェアスタック全体、インストール、ビルドワークフロー、カーネルプログラミング、メモリ管理、パフォーマンス工学、ライブラリの利用、CUDAからの移行、本番環境でのデバッグ手法をカバー。
この技術的詳細を通じて、AMD GPUプログラミングとCUDAからHIPへの移行性を習得しよう。
著者: EvoClass
謝辞: AMD公式のROCmおよびHIPドキュメントベース(ROCm、HIP、ROCm LLVMなど)。
🎯 学習目標
- HIPとは何か、そしてそれがROCmエコシステムの中で果たす役割を一文で明確に定義する。
- ROCm(プラットフォーム)、HIP(インターフェース)、ROCmライブラリ(構成ブロック)の違いを識別する。
- ハードウェアからアプリケーションフレームワークまで、ROCmアーキテクチャの階層的レイヤーを特定する。
- 不同のオペレーティングシステムにおけるHIP SDKとROCmプラットフォームの関係を定義する。
- サポートマトリクスの確認とインストール後のパス設定を含む、体系的なインストールワークフローを実行する。
- 一般的なドライバや環境アクセスの問題をトラブルシュートするための最小限の検証プログラムをコンパイルして実行する。
- ソースコードの移植性とアーキテクチャ固有のパフォーマンスの調和のために、堅牢なビルド戦略が不可欠である理由を理解する。
- CUDAの三重角括弧構文の代替として、
hipLaunchKernelGGLマクロを使用した移植可能なカーネル起動を実装する。 - 特定のROCmアーキテクチャをターゲットにし、外部ライブラリの依存関係を管理するプロダクショングレードのCMakeプロジェクトを設定する。
- HIPカーネルの構造を定義し、スレッドインデックスの基本実行式を適用する。
🔹 教習1:ROCmとHIPアーキテクチャの紹介
概要: この教習では、ROCmプラットフォームとHIPプログラミング言語の基礎を概観する。全般的なROCmスタック、HIPインターフェース、高レベルライブラリとの関係を明確にし、CUDAからAMDへの移行可能性とパフォーマンス工学に対する現実的な期待値を設定する。
学習成果:
- HIPとは何か、そしてそれがROCmエコシステム内で果たす役割を一文で定義する。
- ROCm(プラットフォーム)、HIP(インターフェース)、ROCmライブラリ(構成ブロック)の違いを識別する。
- ハードウェアからアプリケーションフレームワークまでの、ROCmアーキテクチャの階層的レイヤーを特定する。
🔹 教習2:インストールと環境設定
概要: この教習では、GPU開発者およびHPCエンジニアが、LinuxおよびWindows両方のプラットフォーム上でHIP対応環境をセットアップするための基本戦略を説明する。ハードウェア/ソフトウェア互換性の確認を「プラットフォームの現実」に基づいて行い、構造化されたインストールワークフローを進め、最終的にhipccコンパイラーを使って検証を行うことを強調する。
学習成果:
- 不同のオペレーティングシステムにおけるHIP SDKとROCmプラットフォームの関係を定義する。
- サポートマトリクスの確認とインストール後のパス設定を含む、体系的なインストールワークフローを実行する。
- 一般的なドライバや環境アクセスの問題をトラブルシュートするための最小限の検証プログラムをコンパイルして実行する。
🔹 教習3:ビルドツールチェーン:hipccとプロジェクト構造
概要: この教習では、AMDハードウェア上でHIPアプリケーションを開発するための基本的なツールチェーンと組織戦略を探求する。hipccドライバーを使った単純なコマンドラインビルドから、CMakeを活用したプロフェッショナルかつプロダクション準備完了のプロジェクト構成へと移行する。主な焦点は、移植可能なカーネル起動マクロ、アーキテクチャ固有の最適化、ソースレベルの移植性とバイナリパフォーマンスの重要な違いにある。
学習成果:
- ソースコードの移植性とアーキテクチャ固有のパフォーマンスの調和のために、堅牢なビルド戦略が不可欠である理由を理解する。
- CUDAの三重角括弧構文の代替として、
hipLaunchKernelGGLマクロを使用した移植可能なカーネル起動を実装する。 - 特定のROCmアーキテクチャをターゲットにし、外部ライブラリの依存関係を管理するプロダクショングレードのCMakeプロジェクトを設定する。
🔹 教習4:HIPプログラミングモデルとカーネル開発
概要: この教習では、HIPカーネルの基本的なアーキテクチャに焦点を当て、論理的な問題からハードウェア実行へとワークがマッピングされる方法(グリッドとブロックを介して)を解説する。信頼性の高いGPUプログラミングのためのブループリンターを提供し、必須の実行式、パフォーマンスのボトルネック(メモリ vs. コンピュート)、およびプロダクション向けコードにおいて必須となるエラー検出と同期処理の実装をカバーする。
学習成果:
- HIPカーネルの構造を定義し、スレッドインデックスの基本実行式を適用する。
- グリッドとブロックサイズを効果的に設定し、最適なスループットを見つけるためのベンチマークを実装する。
- 健全なエラーハンドリングマクロを実装し、デバイス-ホスト間の相互作用を管理する同期セマンティクスを適用する。
🔹 教習5:メモリ管理とデータパターン
概要: この教習では、GPUプログラミングの中心となるテーマであるメモリ管理に焦点を当てる。メモリタイプ(ページ可能、ピン止め、デバイス、マネージド)の分類、データ転送機構のパフォーマンスへの影響、そして特にコアレスティング(コヒーレントアクセス)というメモリアクセスパターンの重要性について解説する。ピークパフォーマンスを達成するためには、マネージドメモリの使いやすさと、高性能HPCアプリケーションに必要な明示的な制御のバランスを取る必要がある。
学習成果:
- ページ可能とピン止めのホストメモリの違いを区別し、最適な転送速度を得るためにそれぞれの使用タイミングを特定する。
- HIP API(
hipMalloc、hipHostMalloc、hipMallocManaged)を使用してデバイスメモリの割り当てと統合/マネージドメモリを実装する。 - メモリアクセスパターンを分析し、コアレスティングアクセスを確保し、ストライドアクセスのようなパフォーマンスボトルネックを回避する。
🔹 教習6:ストリーム、イベント、非同期実行
概要: この教習では、同期プログラミングモデルから並行処理の思考へと開発者を移行させ、HIPストリームとイベントを活用してGPUの利用率を最大化する方法を扱う。チャンク化パイプラインを通じて、データ転送とカーネル実行を重ねることのメカニズムを説明し、ストリームキャプチャと明示的グラフ構築のトレードオフを紹介する。さらに、グラフセーフライブラリの使用やGPU上の高精度タイマーといった、プロダクションにおける重要な考慮事項にも言及する。
学習成果:
- 非同期実行と並行ストリームのパフォーマンスメリットを、同期実行と比較して識別する。
- ホスト→デバイス通信とカーネル計算を重ねるためのチャンク化パイプラインを実装する。
- ストリームキャプチャと明示的グラフ構築の違いを理解し、起動オーバーヘッドを削減する。
🔹 教習7:AMD GPUにおけるパフォーマンス工学
概要: この教習では、AMDハードウェア上でソフトウェアを最適化するための科学的枠組みを確立し、推測に頼るのではなく、体系的かつ測定に基づくアプローチに移行する。コンピュートユニット、ウェーフロント、レジスタプレッシャーのアーキテクチャ的関係を扱い、rocprofv3によるプロファイリングと堅牢なベンチマークスケルトンの実装に関する実践的なメソッドを提供する。
学習成果:
- パフォーマンスボトルネックを特定・解決するための6ステップのHIP最適化ワークフローを実装する。
- レジスタプレッシャーとオキュパンシーのトレードオフを分析し、ハードウェアの利用率を最大化する。
- ハードウェアイベントとマルチイテレーションベンチマークのベストプラクティスを使用して正確なパフォーマンス測定を行う。
🔹 教習8:ROCmライブラリエコシステム
概要: この教習では、「ライブラリ第一」のエンジニアリング哲学を紹介し、カスタムカーネル開発よりも高性能で事前ビルド済みのROCmライブラリを優先することを強調する。ROCmライブラリスタック(数学、FFT、プリミティブ、ML/AI)の分類をカバーし、移植性要件とパフォーマンス要件に基づいてhip*インターフェースとAMDネイティブのroc*実装の選択基準を提示する。また、HIPグラフキャプチャワークフローにライブラリを統合する際の「グラフセーフ」要件についても探求する。
学習成果:
- 「ライブラリ第一」のエンジニアリング原則を適用し、カスタムカーネルより事前に検証済みのプリミティブの使用を正当化する。
- 移植性要件とパフォーマンス要件に基づいて
hip*とroc*ライブラリの違いを識別する。 - ライブラリを機能領域(数学、FFT、プリミティブ、ML/AI)ごとに分類する。
🔹 教習9:CUDAアプリケーションからHIPへの移行
概要: この教習では、CUDAソースコードを移植可能なHIP C++フレームワークに系統的に移行するプロセスを扱う。自動化ツール(hipify-perl、hipify-clang)を使用した段階的な移行ワークフローの実行、ハードウェア依存のwarpSize仮定などの重大な移植性の罠の特定、そして移行後の性能と正しさを比較する厳密な検証プロセスの実装について学ぶ。
学習成果:
- デバッグ負荷を最小限に抑えるための6ステップの段階的移行ワークフローを実行する。
- ソースコードの複雑さに基づいて、適切な自動変換ツール(
hipify-perlvs.hipify-clang)を選択・適用する。 warpSizeや機械的翻訳エラーに関連するアーキテクチャに敏感な「移植性の罠」を特定し、解決する。
🔹 教習10:デバッグ、テスト、プロダクション運用
概要: この教習では、ROCmプラットフォーム上でGPUカーネルを開発からプロダクションまで移行するための必須ツールと手法をカバーする。エラー検出に向けたROCgdbとAddressSanitizerの使用、厳格な4層テスト戦略の確立、およびカーネルの正しさとパフォーマンス安定性を保証するためのプロダクションチェックリストを提供する。
学習成果:
- ROCgdb、ltrace、AddressSanitizer を使って、GPUコード内のソースレベルのバグやメモリアクセスエラーを特定する。
- ヘルパーの検証、カーネルの正しさ、エッジケース、パフォーマンスの低下を検証する4層テスト戦略を実装する。
- カーネルインターフェース、ドキュメンテーション、環境依存のデバッグを管理するためのプロダクションコードパターンとチェックリストを適用する。