ROCmは、Advanced Micro Devices(AMD)がグラフィックス処理装置(GPU)プログラミング向けに開発したソフトウェアスタックである。これは、グラフィックス処理装置上の汎用計算(GPGPU)、高性能計算(HPC)、およびヘテロジニアスコンピューティングなど、複数の領域にわたる。ROCmは、HIP(GPUカーネルベースのプログラミング)、OpenMP(ディレクティブベースのプログラミング)、OpenCLなど、複数のプログラミングモデルを提供する。このスタックは、GPUファームウェアのバイナリブロブを除き、自由かつオープンソースのソフトウェアであり、さまざまなライセンスの下で配布されている。この名称は当初「Radeon Open Compute platform」の略称であったが、Open Computeが登録商標であるため、現在は頭字語としては機能していない。
ROCmは、科学シミュレーションからMachine learningワークロードまで、開発者がAMD GPUを計算集約型タスクに活用するための統一プラットフォームを提供するように設計されている。これには、低レベルのカーネルドライバから高レベルのライブラリやツールまで、さまざまなコンポーネントが含まれており、多様なハードウェア上での効率的な実行を可能にする。このスタックは、AMDとオープンソースコミュニティによって積極的に開発されており、プロフェッショナル向けおよびコンシューマ向けの両方のGPUをサポートしている。
背景
ATI/AMDによる最初のGPGPUソフトウェアスタックはClose to Metalであり、後にStreamとなった。ROCmは、2016年頃にボルツマンイニシアチブとともに立ち上げられ、以前のAMD GPUスタックを基盤としていた。一部のツールはGPUOpenに由来し、他はヘテロジニアスシステムアーキテクチャ(HSA)に由来する。2026年7月、AMDはROCmが6週間のリリースサイクルを採用し、より頻繁な更新と改善を目指すことを発表した。
ヘテロジニアスシステムアーキテクチャ中間言語
HSAILは、ハードウェアに依存しない中レベルの中間表現を生成し、適切なファイナライザを使用して最終的なハードウェア(GPU、FPGAなど)にJITコンパイルできるように設計されていた。このアプローチはROCmでは廃止され、現在はLLVMとその上流に統合されたAMDGPUバックエンドを使用してGPUコードのみを構築している。ただし、LLVM MLIRによる拡張モジュール性に関する研究は継続されている。
プログラミング能力
ROCmはスタックとして、カーネルドライバからエンドユーザーアプリケーションまでを範囲とする。AMDは、学習ポータルを通じてAMD GCNハードウェアとROCmプログラミングに関する入門ビデオを提供している。スタックとROCm/HIPプログラミングに関する最も優れた技術的入門の1つは、現在に至るまでRedditで見つけることができる。
ハードウェアサポート
ROCmは主にディスクリートのプロフェッショナル向けGPUを対象としているが、サポートされているプロフェッショナルGPUと同じアーキテクチャのコンシューマ向けGPUおよびAPUもROCmで動作することが知られている。例えば、RDNA 2アーキテクチャのすべてのプロフェッショナルGPUはROCm 5.xで公式にサポートされており、ユーザーはRadeon 6800M APUやRadeon 6700XT GPUなどのコンシューマ向けRDNA2ユニットも動作すると報告している。
プロフェッショナルグレードGPU
ROCmは、CDNAおよびRDNAアーキテクチャに基づくものを含む、さまざまなプロフェッショナルGPUを公式にサポートしている。これらは通常、HPCおよびArtificial intelligenceワークロード向けにデータセンターやワークステーションで使用される。サポートは各リリースで継続的に拡大されている。
コンシューマグレードGPU
公式には保証されていないが、サポートされているプロフェッショナルモデルと同じアーキテクチャファミリの多くのコンシューマGPUがROCmで機能する。コミュニティは、コンシューマ向けRadeon GPUの計算タスクでの使用成功を文書化しているが、パフォーマンスと安定性は異なる場合がある。
ソフトウェアエコシステム
機械学習
さまざまなDeep learningフレームワークがROCmバックエンドを備えており、AMDハードウェアでのGPUアクセラレーションを可能にしている。注目すべきフレームワークには、PyTorch、TensorFlow、ONNX、MXNet、CuPy、MIOpen、Caffe、Iree(LLVM MLIRを使用)、およびllama.cppが含まれる。これらの統合により、開発者はAMD GPU上でNeural networkのトレーニングと推論を実行でき、Large language modelやTransformer (architecture)アーキテクチャなどのモデルをサポートする。
スーパーコンピューティング
ROCmは、トップ500のスーパーコンピュータで大きな勢いを得ている。これは、エクサスケールスーパーコンピュータのEl CapitanおよびFrontierで使用されている。関連ソフトウェアはAMD Infinity Hubで利用可能であり、科学研究向けのコンテナ化されたアプリケーションを提供している。
その他のアクセラレーションとグラフィックス相互運用
バージョン3.0以降、BlenderはCyclesレンダラーのためにHIPコンピュートカーネルを使用でき、AMDハードウェアでのGPUアクセラレーションレンダリングを可能にしている。
その他の言語
#### Julia
JuliaにはAMDGPU.jlパッケージがあり、LLVMと統合し、ROCmスタックのコンポーネントを選択する。AMDGPU.jlは、HIPを介してコードをコンパイルする代わりに、Juliaのコンパイラを使用してLLVM IRを直接生成し、その後LLVMがネイティブデバイスコードを生成するために消費する。AMDGPU.jlは、HIPが独自の生成デバイスコードをロードする方法と同様に、ROCrのHSA実装を使用してネイティブコードをデバイスにアップロードして実行する。AMDGPU.jlは、ROCmのrocBLAS(BLAS用)、rocRAND(乱数生成用)、およびrocFFT(FFT用)との統合もサポートしている。rocALUTION、rocSOLVER、MIOpen、およびその他のROCmライブラリとの将来の統合が計画されている。
ソフトウェア配布
公式
LinuxおよびWindows向けのインストール手順は、公式のAMD ROCmドキュメントに記載されている。ROCmソフトウェアは現在、複数の公開GitHubリポジトリに分散している。主要な公開メタリポジトリ内には、各公式リリース用のXMLマニフェストがあり、Gitの上に構築されたバージョン管理ツールであるgit-repoを使用して、スタックをローカルで同期することが推奨されている。AMDはまた、ROCm用のコンテナ化されたアプリケーション、特にAMD Infinity Hubに集約された科学研究アプリケーション、およびさまざまなLinuxディストリビューションに合わせたパッケージを配布している。
サードパーティ
ROCmをパッケージ化するサードパーティエコシステムが成長している。Linuxディストリビューションは、Arch Linux、Gentoo、Debian、Fedora、GNU Guix、NixOSなど、さまざまな進捗度でROCmをネイティブに公式パッケージ化している。HPC環境向けのSpackパッケージもある。
コンポーネント
カーネル空間コンポーネントが1つ(ROCk)あり、残り(スタック内の約100のコンポーネント)はユーザー空間モジュールである。非公式の表記方針は、低レベルライブラリでは大文字のROCと小文字の続き(例:ROCt)を使用し、ユーザー向けライブラリではその逆(例:rocBLAS)を使用することである。AMDはLLVMコミュニティと積極的に開発しているが、上流への統合は即時的ではなく、2022年1月時点ではまだ遅れている。AMDは、まだ上流に統合されていない部分、プロプライエタリのままとなるコンパイラ最適化、デバッグサポート、OpenMPオフロードなどを含む、さまざまなLLVMフォークを公式にパッケージ化している。
低レベル
#### ROCk - カーネルドライバ
ROCkカーネルドライバは、GPUハードウェアを管理し、ユーザー空間ライブラリへのインターフェースを提供する中核的なカーネル空間コンポーネントである。
#### ROCm - デバイスライブラリ
LLVMビットコードとして実装されたサポートライブラリ。これらは、数学演算、アトミック、起動パラメータのクエリ、デバイス上のカーネル起動など、さまざまなユーティリティと機能を提供する。
#### ROCt - サンク
サンクは、スタック内のすべての思考とキューイングを担当し、カーネルドライバとの低レベルな相互作用を処理する。
#### ROCr - ランタイム
ROCランタイムは、ホストアプリケーションによるコンピュートカーネルの起動を可能にするAPIとライブラリのセットである。これは、HSAランタイムAPIのAMD実装である。これは、ROC共通言語ランタイムとは異なる。
#### ROCm - コンパイラサポート
ROCmコードオブジェクトマネージャは、LLVM中間表現との相互作用を担当し、コードオブジェクトとそのロードを管理する。
中レベル
#### ROCclr共通言語ランタイム
共通言語ランタイムは、Linux上のROCrとWindows上のPALへの呼び出しを適応させる間接層である。以前は、HSAILコンパイラなどの異なるコンパイラ間でルーティングできた。現在は、上位の間接層(HIPおよびOpenCL)に吸収されつつある。
#### OpenCL
ROCmは、インストール可能なクライアントドライバ(ICD)ローダーとOpenCL実装をバンドルして出荷している。2022年1月時点で、ROCm 4.5.2はOpenCL 2.2を出荷しており、競合に遅れを取っている。
#### HIP - 移植性のためのヘテロジニアスインターフェース
AMD GPU向けのAMD実装はHIPAMDと呼ばれる。CPU実装もあり、主にデモンストレーション目的である。
#### HIPCC
HIPは、ClangをラップしてLLVMのオープンAMDGPUバックエンドでコンパイルするか、NVIDIAコンパイラにリダイレクトするHIPCCコンパイラを構築する。
#### HIPIFY
HIPIFYは、ソースからソースへのコンパイルツールである。CUDAをHIPに、またはその逆に変換し、ClangベースのツールまたはsedのようなPerlスクリプトを使用する。
#### GPUFORT
HIPIFYと同様に、GPUFORTはソースコードを他のターゲットにコンパイルするツールであり、FortranコードのGPU実行への移植を容易にする。