ROCm
General-purpose computing on graphics processing units (GPGPU) API の定義には、ベンダー非依存の OpenCL、SYCL、HIP、OpenMP、Vulkan compute shader、および Nvidia の CUDA が含まれます。それぞれの API には、GPU、CPU、NPU、FPGA、あるいは別の GPGPU API (shim/transpiler) など、複数の種類のハードウェアまたはソフトウェア上で複数の実装が存在する場合があります。
OpenCL
OpenCL (Open Computing Language) は、非営利コンソーシアムである Khronos Group によって開発された、オープンでロイヤリティフリーの並列プログラミング仕様です。
OpenCL 仕様では、C ベースのプログラミング言語、存在する必要がある汎用環境、およびプログラマがこの環境を呼び出すための C API が定義されています。また、他の言語からこの環境を呼び出すためのバインディングや、OpenCL 計算カーネルを記述するための代替言語もあります。
OpenCL 環境には、少なくとも以下のいずれかが含まれます:
- 完全な OpenCL API インターフェイスを提供する ICD loader である libOpenCL.so のコピー。
- ICD loader によってロードされる、プラットフォーム依存のドライバー。
ICD loader (libOpenCL.so)
システムに複数の OpenCL 対応ハードウェアがあり、そのため複数の OpenCL ランタイム実装が存在することは非常によくあります。"OpenCL ICD loader" と呼ばれるコンポーネントは、OpenCL API を通じてデバイス固有のドライバーをロードする手段を提供する、プラットフォーム非依存のライブラリであることが想定されています。 ほとんどの OpenCL ベンダーは独自の OpenCL ICD loader 実装を提供しており、これらは他のベンダーの OpenCL 実装とも動作するはずです。残念ながら、ほとんどのベンダーは完全に最新の ICD loader を提供していません。そのため Arch Linux では、現在の OpenCL API の動作する実装を提供する別プロジェクト (ocl-icd) からこのライブラリを提供することにしました。2025 年時点で、現在の OpenCL バージョンは 3.0 です。
他の ICD loader ライブラリは、それぞれのベンダーの SDK の一部としてインストールされます。ocl-icd パッケージの ICD loader が使用されるようにしたい場合は、/etc/ld.so.conf.d に /usr/lib を動的プログラムローダーの検索ディレクトリに追加するファイルを作成できます:
/etc/ld.so.conf.d/00-usrlib.conf
/usr/lib
すべての SDK が、ld.so.conf.d ファイルを通じて、それぞれのランタイムの lib ディレクトリを検索パスに追加するため、これは必要です。
各種 OpenCL ICD を含む利用可能なパッケージは以下の通りです:
- ocl-icd: 推奨、最も新しい
- Intel による intel-openclAUR。OpenCL 2.0 を提供しますが、intel-compute-runtime を優先して非推奨です。
実装の管理
現在システムで有効な OpenCL 実装を確認するには、次のコマンドを使用します:
$ ls /etc/OpenCL/vendors
システム上で利用可能な OpenCL プラットフォームとデバイスの、可能なすべての既知プロパティを調べるには、clinfo を インストール してください。
アプリケーションから見える実装を指定するには、ocl-icd-chooseAUR を使用できます。例:
$ ocl-icd-choose amdocl64.icd:mesa.icd davinci-resolve-checker
ocl-icd-choose は、OCL_ICD_FILENAMES 環境変数を設定する単純なラッパースクリプトです。マニュアルで示されているように OCL_ICD_VENDORS が単一の icd ファイルを扱えるなら不要なはずですが、これは OCL-dev/ocl-icd#7 として追跡されている既知のバグです。
ランタイム
OpenCL を使用するプログラムを実行するには、libOpenCL.so からロードできるランタイムをインストールする必要があります。
汎用 GPU 上の OpenCL
Mesa によってサポートされる任意の GPU では、opencl-mesa をインストールすることで rusticl を使用できます。これは 環境変数 RUSTICL_ENABLE=driver を使用して有効にできます。ここで driver は、radeonsi や iris などの Gallium ドライバーです。最も幅広いハードウェアで動作しますが、必ずしも最高の性能を提供するとは限りません。他のドライバーの設定で問題がある場合は試してみてください。有効化に必要な設定はごくわずかです。
AMD/ATI GPU 上の OpenCL
- rocm-opencl-runtime: AMD の ROCm GPU compute stack の一部で、限られた範囲の GPU モデル を公式にサポートします (他のカードも非公式または部分的なサポートで動作する場合があります)。Vega より古いカードをサポートするには、ランタイム変数
ROC_ENABLE_PRE_VEGA=1を設定する必要があります。これは Ubuntu の amdgpu-install でopencl=rocrを 指定する ことと似ていますが、完全に同等ではありません。このパッケージの rocm バージョンは Ubuntu のインストーラー版とは異なるためです。 - opencl-legacy-amdgpu-proAUR: AMD の Ubuntu リリースから再パッケージされた Legacy Orca OpenCL。Ubuntu の amdgpu-install で
opencl=legacyを 指定する ことに相当します。 - opencl-amdAUR, opencl-amd-devAUR: AMD の Ubuntu リリースから再パッケージされた ROCm コンポーネント。Ubuntu の amdgpu-install で
opencl=rocr,legacyを 指定する ことに相当します。
OpenCL image support
最新の ROCm バージョンには、Darktable などの GPGPU アクセラレーションソフトウェアで使用される OpenCL Image Support が含まれるようになりました。必要なのは、ROCm と AMDGPU オープンソースグラフィックドライバーのみです。AMDGPU PRO は不要です。
$ /opt/rocm/bin/clinfo | grep -i "image support"
Image support Yes
NVIDIA GPU 上の OpenCL
- opencl-nvidia: 公式 NVIDIA ランタイム
Intel GPU 上の OpenCL
- intel-compute-runtime: "NEO" ランタイムとも呼ばれる、Intel Gen12 (Rocket/Tiger Lake) Integrated Graphics 以降向けの、オープンソースの OpenCL および oneAPI Level Zero 実装です。すべてのディスクリート Intel GPU も含まれます。
- intel-compute-runtime-legacyAUR: 上記と同じですが、一部の oneAPI Level Zero サポートを含み、Intel Gen8 (Broadwell)、Gen9 (Skylake および派生)、Gen11 (Ice/Elkhart Lake) Graphics のみを対象とします。レガシープラットフォーム向けに提供される OpenCL ICD には "legacy1" という接尾辞があります。
- beignetAUR: Intel Gen7 (Ivy Bridge) Graphics 以降向けのオープンソース OpenCL 実装です。Intel によって NEO OpenCL ランタイムを優先して非推奨となっていますが、レガシーハードウェアプラットフォーム (例: Ivy Bridge、Haswell) では推奨される解決策のままです。
- intel-openclAUR: Intel Gen7 (Ivy Bridge) Graphics 以降向けのプロプライエタリな OpenCL 実装です。Intel によって NEO OpenCL ランタイムを優先して非推奨となっていますが、レガシーハードウェアプラットフォーム (例: Ivy Bridge、Haswell) では推奨される解決策のままです。
CPU 上の OpenCL
以下により、OpenCL を CPU 上で実行できます:
- intel-opencl-runtimeAUR: x86_64 プロセッサ向けの、Intel の LLVM および oneAPI ベースの実装です。公式には Intel Core および Xeon プロセッサ向けですが、実際には SSE4.1 を備えたすべての x86_64 プロセッサで動作します。AMD Zen プロセッサ上でも pocl より高性能です。
- pocl: LLVM ベースの OpenCL 実装で、LLVM がサポートするすべての CPU アーキテクチャ、一部の GPU (libCUDA 経由の Nvidia、Level Zero 経由の Intel)、および OpenASIP で動作します。この広い対応範囲にもかかわらず、性能はあまり良くありません。
- amdapp-sdkAUR: AMD CPU ランタイム、放棄済み
Vulkan 上の OpenCL
以下により、OpenCL を Vulkan ランタイム上で実行できます:
- clspv-gitAUR: Clspv は、OpenCL C のサブセットを Vulkan compute shader に変換するプロトタイプコンパイラです。
- clvk-gitAUR: clvk は、コンパイラとして clspv を使用する、Vulkan 上の OpenCL 3.0 のプロトタイプ実装です。
FPGA 上の OpenCL
- OpenASIP 向けの pocl。上記を参照。
- xrt-binAUR: FPGA 向け Xilinx Run Time xrt
- fpga-runtime-for-opencl: Intel FPGA Runtime
32 ビットランタイム
OpenCL を使用する 32 ビットプログラムを実行するには、互換性のあるハードウェア向け 32 ビットランタイムをインストールする必要があります。
汎用 GPU 上の OpenCL (32 ビット)
- lib32-opencl-mesa: Mesa ドライバー向け OpenCL サポート (32 ビット)
NVIDIA GPU 上の OpenCL (32 ビット)
- lib32-opencl-nvidia: NVIDIA 向け OpenCL 実装 (32 ビット)
開発
OpenCL 開発に必要な最小限の追加パッケージは以下です:
- ocl-icd: OpenCL ICD loader 実装。最新の OpenCL 仕様に対応しています。
- opencl-headers: OpenCL C/C++ API ヘッダー。
ベンダーの SDK は、多数のツールとサポートライブラリを提供します:
- intel-opencl-sdkAUR: Intel OpenCL SDK (古いバージョン。新しい OpenCL SDK は INDE および Intel Media Server Studio に含まれています)
- amdapp-sdkAUR: このパッケージは
/opt/AMDAPPとしてインストールされ、SDK ファイルに加えて多数のコードサンプル (/opt/AMDAPP/SDK/samples/) も含みます。また、システムに存在する OpenCL プラットフォームとデバイスを一覧表示し、それらの詳細情報を表示するclinfoユーティリティも提供します。SDK 自体に CPU OpenCL ドライバーが含まれているため、CPU デバイスで OpenCL を実行するための追加ドライバーは不要です (ベンダーに関係なく)。 - rocm-opencl-sdk: AMD プラットフォーム向けの OpenCL ベースアプリケーションを開発します。
- cuda: Nvidia の GPU SDK で、OpenCL 3.0 のサポートを含みます。
言語バインディング
これらのバインディングにより、他の言語から OpenCL 環境を呼び出せます。通常、OpenCL C でカーネルを記述する必要性は変わりません。
- JavaScript/HTML5: WebCL
- Python: python-pyopencl
- D: cl4d または DCompute
- Java: Aparapi または JOCL (JogAmp の一部)
- Mono/.NET: Open Toolkit
- Go: OpenCL bindings for Go
- Racket: Racket には PLaneT 上のネイティブインターフェイスがあり、raco でインストールできます。
- Rust: ocl
- Julia: OpenCL.jl
SYCL
Wikipedia:SYCL によると:
SYCL は、さまざまなハードウェアアクセラレータでのプログラミング生産性を向上させるための、より高水準のプログラミングモデルです。これは純粋な C++17 に基づく、単一ソースの組み込みドメイン固有言語 (eDSL) です。
SYCL は [...] OpenCL に着想を得たもので、異種プロセッサ向けのコードを完全に標準的な C++ を使用して “single-source” スタイルで記述できるようにします。SYCL により、C++ テンプレート関数にホストコードとデバイスコードの両方を含めて、ハードウェアアクセラレータを使用する複雑なアルゴリズムを構築し、それを異なる種類のデータに対してソースコード全体で再利用できる、single-source 開発が可能になります。
SYCL 標準は、OpenCL ワーキンググループの高水準プログラミングモデルサブグループとして始まり、もともとは OpenCL と SPIR で使用するために開発されましたが、SYCL は OpenCL ワーキンググループから独立した Khronos Group ワークグループです [...] SYCL 2020 以降、SYCL はより汎用的な異種フレームワークとして一般化され、他のシステムを対象にできるようになりました。これは、任意のアクセラレーション API を対象にする generic backend の概念により可能になっており、既存のネイティブライブラリを使用して最大性能に到達しつつ、プログラミング作業を簡素化するなど、対象 API との完全な相互運用性を可能にします。例えば、OpenSYCL 実装は AMD のクロスベンダー HIP を介して ROCm と CUDA を対象にします。
言い換えると、SYCL は C++17 に基づくプログラミング環境を定義します。この環境は、CPU と GPGPU の両方に向けたコードを生成するコンパイラと組み合わせることを意図しています。GPGPU 側で使用される言語は以前は SPIR でしたが、他の中間表現を対象とするコンパイラも存在します。
実装
- trisycl-gitAUR: 主に Xilinx によって進められているオープンソース実装。
- adaptivecppAUR: すべてのベンダーの CPU と GPU 向けに、複数のプログラミングモデル (SYCL、C++ standard parallelism、HIP/CUDA) をサポートするコンパイラ。
- intel-oneapi-dpcpp-cpp: Intel の Data Parallel C++。SYCL の LLVM/oneAPI 実装です。
- computecppAUR Codeplay のプロプライエタリな SYCL 1.2.1 実装。デバイスターゲットとして SPIR、SPIR-V、および実験的に PTX (NVIDIA) を対象にできます (2023 年 9 月 1 日にサポート終了。intel llvm 実装に統合される予定 Source)。
oneAPI
oneAPI は、Intel の多くの高性能コンピューティングライブラリで使用されるマーケティング名です。intel-oneapi-dpcpp-cpp パッケージは /opt/intel/oneapi/setvars.sh を提供し、SYCL プログラムのコンパイルとリンクのための環境設定に使用できます。コンパイラなどの一部コンポーネントは Intel により GitHub でオープンソース化されていますが、それ以外はそうではありません。
追加機能のためにインストールできるパッケージもあります。例えば、intel-oneapi-mkl-sycl は Math Kernel Library (MKL) の GPU オフロードをサポートできるようにします。
SPIR サポートの確認
SYCL はもともと SPIR または SPIR-V にコンパイルされることを意図していました。どちらも Khronos によって設計された中間言語で、OpenCL ドライバーが利用できます。SPIR は OpenCL 1.0 または 2.0 の拡張として含まれ、SPIR-V はバージョン 2.1 以降の OpenCL core に含まれています (clCreateProgramWithIL)。SPIR または SPIR-V がサポートされているか確認するには、clinfo を使用できます:
$ clinfo | grep -i spir
Platform Extensions cl_khr_icd cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_depth_images cl_khr_3d_image_writes cl_intel_exec_by_local_thread cl_khr_spir cl_khr_fp64 cl_khr_image2d_from_buffer cl_intel_vec_len_hint IL version SPIR-V_1.0 SPIR versions 1.2
ComputeCpp には、関連するシステム情報を要約するツールも同梱されています:
$ computecpp_info
Device 0: Device is supported : UNTESTED - Untested OS CL_DEVICE_NAME : Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz CL_DEVICE_VENDOR : Intel(R) Corporation CL_DRIVER_VERSION : 18.1.0.0920 CL_DEVICE_TYPE : CL_DEVICE_TYPE_CPU
少なくとも部分的に SPIR または SPIR-V をサポートすることが知られているドライバーには、intel-compute-runtime、intel-opencl-runtimeAUR、pocl があります。
SPIR/SPIR-V のその他の用途
SPIR-V は計算カーネルだけでなく、グラフィックシェーダーも対象にします。OpenGL と Vulkan のシェーダー中間言語として、また OpenCL、Vulkan、SYCL の計算中間言語として機能できます。また、カーネルやシェーダーをある言語から別の言語へ変換する方法として、逆コンパイルすることもできます。
C++ for OpenCL 言語 (短命だった "OpenCL C++" と混同しないでください) は、C++17 と OpenCL C を組み合わせたものです。一部の OpenCL ドライバーは、OpenCL C と同じように clBuildProgram() で直接ロードすることをサポートしていますが、主な想定用途は、まず clang により SPIR-V へ変換することです。SYCL のモデル全体を採用せずに OpenCL カーネルを C++17 で記述したいプログラマにとって、選択肢となります。
開発
SYCL には、動作する C++11 環境の設定が必要です。
SYCL の C++17 言語で並列機能を利用するためのオープンソースライブラリがいくつかあります:
- ComputeCpp SDK: コード例集、ComputeCpp 向け cmake 統合
- SYCL-DNN: ニューラルネットワーク性能プリミティブ
- SYCL-BLAS: 線形代数性能プリミティブ
- VisionCpp: Computer Vision ライブラリ
- SYCL Parallel STL: C++17 並列アルゴリズムの GPU 実装
CUDA
CUDA (Compute Unified Device Architecture) は、NVIDIA のプロプライエタリでクローズドソースの並列コンピューティングアーキテクチャおよびフレームワークです。NVIDIA GPU が必要で、いくつかのコンポーネントで構成されます:
- 必須:
- NVIDIA カーネルモジュール
- CUDA "driver" および "runtime" ライブラリ
- 任意:
- 追加ライブラリ: CUBLAS、CUFFT、CUSPARSE など
nvccコンパイラを含む CUDA toolkit- CUDA および OpenCL プログラムの多数のコードサンプルと例を含む CUDA SDK
カーネルモジュールと CUDA "driver" ライブラリは nvidia-open と opencl-nvidia に含まれています。"runtime" ライブラリと CUDA toolkit の残りは cuda で利用できます。cuda-gdb には ncurses5-compat-libsAUR のインストールが必要です。FS#46598 を参照してください。
開発
cuda パッケージはすべてのコンポーネントを /opt/cuda ディレクトリにインストールします。/etc/profile.d/cuda.sh のスクリプトは関連する環境変数を設定し、CUDA をサポートするすべてのビルドシステムがそれを見つけられるようにします。
インストールが成功したか、CUDA が起動して動作しているかを確認するには、CUDA samples をコンパイルできます。インストールを確認する方法の 1 つは、deviceQuery サンプルを実行することです。
言語バインディング
- Fortran: PGI CUDA Fortran Compiler
- Haskell: accelerate package は利用可能な CUDA バックエンドを一覧しています
- Java: JCuda
- Mathematica: CUDAlink
- Mono/.NET: CUDAfy.NET、managedCuda
- Perl: KappaCUDA、CUDA-Minimal
- Python: python-pycuda
- Ruby: rbcuda
- Rust: Rust-CUDA。メンテナンスされていないもの: cuda-sys (バインディング)、RustaCUDA (高水準ラッパー)。
ROCm
ROCm ROCm (Radeon Open Compute Platform) は、AMD による CUDA への回答です。ドライバー (AMDGPU) からコンパイラ、ランタイムライブラリまで、CUDA と同様に多くのソフトウェア部品を含みます。一部は特定の AMD GPU 専用であり、他の部分は完全にハードウェア非依存です。詳細は ROCm for Arch Linux repository を参照してください。
ROCm は、AMDGPU ドライバー上で compute capabilities を実装する単一のソフトウェアスタックを含みます。このスタックの上に、HIP、OpenMP、OpenCL を実装します。また、HIP の上に構築された一部の部品や、NVIDIA の CUDA stack を使用する HIP の実装も含みます。
ROCm 対応モデル
ROCm は Polaris アーキテクチャ (RX 500 シリーズ) 以降の AMD GPU をサポートするはずです。公式の GPU モデル一覧 は非常に短く、主にプロフェッショナルモデルで構成されています。しかし、同等世代のコンシューマー GPU や APU も動作することが知られています。他の世代は、非公式または部分的なサポートで動作する場合があります。Polaris をサポートするには、ランタイム変数 ROC_ENABLE_PRE_VEGA=1 を設定する必要があります。
新しい AMD GPU アーキテクチャが ROCm に追加されるまでには時間がかかります。最新のサポートマトリックスについては Wikipedia:ROCm#Consumer-grade GPUs を参照してください。また、前述の #OpenCL on AMD/ATI GPU も参照してください。
HIP
Heterogeneous Interface for Portability (HIP) は、GPU ハードウェア上で高性能カーネルを設計するための AMD 専用 GPU プログラミング環境です。HIP は C++ runtime API およびプログラミング言語であり、開発者が異なるプラットフォーム上でポータブルなアプリケーションを作成できるようにします。
HIP の仕様は rocm-systems repository で管理されていますが、HIP 自体はハードウェア非依存です。
HIP runtime library パッケージ:
- rocm-hip-runtime: OpenCL ICD loader に相当する高水準ランタイムライブラリ。
- hip-runtime-amd: AMD GPU 向け HIP 実装。
- hip-runtime-nvidia: ROCm における NVIDIA GPU 向け Heterogeneous Interface。これは実際には、CUDA C++ コンパイラ向けのヘッダーファイル群であり、主に
#defineによるリネームで構成されています。
rocm-hip-sdk パッケージには HIP SDK が含まれています。すべてのコンポーネントは /opt/rocm ディレクトリにインストールされます。関連する環境変数を設定するスクリプトは /etc/profile.d/rocm.sh で提供されます。一部のソフトウェアは HIP_PATH も確認する場合があり、これは ROCM_PATH と同じ値に手動で設定できます。
miopen-hip は、AMD のオープンソース深層学習ライブラリ向け HIP バックエンドです。
ROCm トラブルシューティング
まず、/opt/rocm/bin/rocminfo に GPU が表示されるか確認してください。表示されない場合、その GPU が ROCm にサポートされていないか、GPU のサポートなしでビルドされている可能性があります。
デバッグや GPU isolation などについては、ROCm HIP environment variables も確認してください。
OpenMP と OpenACC
OpenMP は CPU multiprocessing での利用でよく知られていますが、一部の作業を GPGPU に移すための offloading もサポートしています。OpenACC も似た位置づけです。どちらも通常の C/C++/Fortran コードに pragma を挿入し、コンパイラがマークされた部分を offloading または multiprocessing 用に分離する仕組みに基づいています。
- AMD は ROCm 対応 AMD GPU 向けの OpenMP 実装を提供しています。openmp-extrasAUR パッケージは、AMD GPU 上の OpenMP API に対する追加サポートを備えたオープンソースの Clang/LLVM ベースコンパイラである AOMP を提供します。
- Nvidia の nvhpc は、同社 GPU 上での GPU offloading を伴う OpenMP 実装を提供します。[1]
- GCC は、OpenMP および OpenACC の offloading 用に Nvidia (nvptx) と AMD (gfx9、gfx10、gfx11) のコードを生成できます [2]。
- Clang/LLVM は、OpenMP および OpenACC の offloading 用に Nvidia (nvptx) と AMD (amdgpu) のコードを生成できます [3] [4]。
GPGPU アクセラレーション対応ソフトウェア一覧
- Bitcoin
- Blender – Nvidia GPU 向け CUDA サポートと AMD GPU 向け HIP サポート。詳細は [5] を参照してください。
- BOINC – 一部のプロジェクトは OpenCL および/または CUDA プログラムを提供しています
- cuda_memtestAUR – GPU memtest。名前にもかかわらず、CUDA と OpenCL の両方をサポートしています。
- darktable – OpenCL 機能には、GPU 上に少なくとも 1 GB RAM と Image support が必要です (clinfo コマンドの出力を確認してください)。
- DaVinci Resolve - ノンリニア動画編集ソフト。OpenCL と CUDA の両方を使用できます。
- FFmpeg – 詳細は [6] を参照してください。
- Folding@home – 分子シミュレーションソフトウェア GROMACS の OpenCL 版と CUDA 版を使用します
- GIMP – 実験的 – 詳細は [7] を参照してください。
- Hashcat
- imagemagick
- LibreOffice Calc – 詳細は [8] を参照してください。
- mpv - mpv#Hardware video acceleration を参照してください。
- lc0AUR - ニューラルネットワークの探索に使用されます (tensorflow、OpenCL、CUDA、openblas をサポート)
- opencl-benchmark - OpenCL 向けの単純な FP64/FP32/FP16/INT64/INT32/INT16/INT8 およびメモリ/PCIe 帯域幅ベンチマークツール
- opencv
- Ollama - LLM 推論ソフトウェア
- llama.cpp - C/C++ による LLM 推論
- pyritAUR
- python-pytorch-cuda, python-pytorch-rocm
- tensorflow-cuda, tensorflow-computecppAUR
- xmrig - High Perf CryptoNote CPU および GPU (OpenCL、CUDA) miner
ROCm 上の PyTorch
ROCm で PyTorch を使用するには、python-pytorch-rocm をインストールしてください。
$ python -c 'import torch; print(torch.cuda.is_available())'
True
ROCm は CUDA のふりをするため、これは True を返すはずです。返さない場合、GPU サポート付きでコンパイルされていないか、依存関係が競合している可能性があります。ldd /usr/lib/libtorch.so を確認することで検証できます。欠落している .so ファイルや、同じ .so の複数バージョンが存在してはいけません。