コンテンツにスキップ

「ROCm」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
訳出
 
リンクに修正
タグ: 新規リダイレクト
 
1行目: 1行目:
#REDIRECT[[GPGPU#ROCm]]
[[Category:開発]]
[[Category:グラフィック]]
[[en:GPGPU]]
[[ru:GPGPU]]
{{Related articles start}}
{{Related|Nvidia}}
{{Related|Hardware video acceleration}}
{{Related articles end}}

[[Wikipedia:GPGPU|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 ==

[[Wikipedia:OpenCL|OpenCL]] (Open Computing Language) は、非営利コンソーシアムである Khronos Group によって開発された、オープンでロイヤリティフリーの並列プログラミング仕様です。

OpenCL 仕様では、C ベースのプログラミング言語、存在する必要がある汎用環境、およびプログラマがこの環境を呼び出すための C API が定義されています。また、他の言語からこの環境を呼び出すためのバインディングや、OpenCL 計算カーネルを記述するための代替言語もあります。

{{Tip|{{pkg|clinfo}} ユーティリティを使うと、OpenCL プラットフォーム、存在するデバイス、ICD loader のプロパティを一覧表示できます。}}

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 の動作する実装を提供する別プロジェクト ({{Pkg|ocl-icd}}) からこのライブラリを提供することにしました。2025 年時点で、現在の OpenCL バージョンは 3.0 です。

他の ICD loader ライブラリは、それぞれのベンダーの SDK の一部としてインストールされます。{{Pkg|ocl-icd}} パッケージの ICD loader が使用されるようにしたい場合は、{{ic|/etc/ld.so.conf.d}} に {{ic|/usr/lib}} を動的プログラムローダーの検索ディレクトリに追加するファイルを作成できます:

{{hc|/etc/ld.so.conf.d/00-usrlib.conf|
/usr/lib
}}

すべての SDK が、{{ic|ld.so.conf.d}} ファイルを通じて、それぞれのランタイムの lib ディレクトリを検索パスに追加するため、これは必要です。

各種 OpenCL ICD を含む利用可能なパッケージは以下の通りです:

* {{Pkg|ocl-icd}}: 推奨、最も新しい
* Intel による {{AUR|intel-opencl}}。OpenCL 2.0 を提供しますが、{{pkg|intel-compute-runtime}} を優先して非推奨です。

{{Note|ICD Loader のベンダーは機能的には関係ありません。正しく実装されている限り、ベンダー非依存であり、相互に入れ替えて使用できるはずです。ベンダーは、それらを識別する目的でのみ有用です。}}

=== 実装の管理 ===

現在システムで有効な OpenCL 実装を確認するには、次のコマンドを使用します:

$ ls /etc/OpenCL/vendors

システム上で利用可能な OpenCL プラットフォームとデバイスの、可能なすべての既知プロパティを調べるには、{{pkg|clinfo}} を [[インストール]] してください。

{{Accuracy|{{ic|OCL_ICD_VENDORS}} のバグがまだ存在するかどうかは疑問です。{{Pkg|ocl-icd}} 2.3.3 では、{{ic|OCL_ICD_VENDORS}} を単一のファイルに設定しても問題なく動作するようで、{{ic|clinfo -l}} は正しい結果を出力します。}}

アプリケーションから見える実装を指定するには、{{AUR|ocl-icd-choose}} を使用できます。例:

$ ocl-icd-choose amdocl64.icd:mesa.icd davinci-resolve-checker

{{ic|ocl-icd-choose}} は、{{ic|OCL_ICD_FILENAMES}} 環境変数を設定する単純なラッパースクリプトです。マニュアルで示されているように {{ic|OCL_ICD_VENDORS}} が単一の icd ファイルを扱えるなら不要なはずですが、これは [https://github.com/OCL-dev/ocl-icd/issues/7#issuecomment-1522941979 OCL-dev/ocl-icd#7] として追跡されている既知のバグです。

=== ランタイム ===

OpenCL を使用するプログラムを'''実行'''するには、''libOpenCL.so'' からロードできるランタイムをインストールする必要があります。

==== 汎用 GPU 上の OpenCL ====

[[Mesa]] によってサポートされる''任意の'' GPU では、{{Pkg|opencl-mesa}} をインストールすることで rusticl を使用できます。これは [[環境変数]] {{ic|RUSTICL_ENABLE{{=}}''driver''}} を使用して有効にできます。ここで {{ic|''driver''}} は、{{ic|radeonsi}} や {{ic|iris}} などの Gallium ドライバーです。最も幅広いハードウェアで動作しますが、必ずしも最高の性能を提供するとは限りません。他のドライバーの設定で問題がある場合は試してみてください。有効化に必要な設定はごくわずかです。

==== AMD/ATI GPU 上の OpenCL ====

* {{Pkg|rocm-opencl-runtime}}: AMD の ROCm GPU compute stack の一部で、[https://rocm.docs.amd.com/projects/install-on-linux/en/latest/reference/system-requirements.html 限られた範囲の GPU モデル] を公式にサポートします (他のカードも非公式または部分的なサポートで動作する場合があります)。Vega より古いカードをサポートするには、ランタイム変数 {{ic|1=ROC_ENABLE_PRE_VEGA=1}} を設定する必要があります。これは Ubuntu の amdgpu-install で {{ic|1=opencl=rocr}} を [https://amdgpu-install.readthedocs.io/en/latest/install-script.html#specifying-an-opencl-implementation 指定する] ことと似ていますが、完全に同等ではありません。このパッケージの rocm バージョンは Ubuntu のインストーラー版とは異なるためです。
* {{AUR|opencl-legacy-amdgpu-pro}}: AMD の Ubuntu リリースから再パッケージされた Legacy Orca OpenCL。Ubuntu の amdgpu-install で {{ic|1=opencl=legacy}} を [https://amdgpu-install.readthedocs.io/en/latest/install-script.html#specifying-an-opencl-implementation 指定する] ことに相当します。
* {{AUR|opencl-amd}}, {{AUR|opencl-amd-dev}}: AMD の Ubuntu リリースから再パッケージされた ROCm コンポーネント。Ubuntu の amdgpu-install で {{ic|1=opencl=rocr,legacy}} を [https://rocm.docs.amd.com/projects/install-on-linux/en/latest/how-to/amdgpu-install.html 指定する] ことに相当します。

===== OpenCL image support =====

最新の ROCm バージョンには、Darktable などの GPGPU アクセラレーションソフトウェアで使用される OpenCL Image Support が含まれるようになりました。必要なのは、ROCm と [[AMDGPU]] オープンソースグラフィックドライバーのみです。AMDGPU PRO は不要です。

{{hc|head=$ /opt/rocm/bin/clinfo {{!}} grep -i "image support"|output=
Image support Yes
}}

==== NVIDIA GPU 上の OpenCL ====

* {{Pkg|opencl-nvidia}}: 公式 [[NVIDIA]] ランタイム

==== Intel GPU 上の OpenCL ====

* {{pkg|intel-compute-runtime}}: "NEO" ランタイムとも呼ばれる、Intel Gen12 (Rocket/Tiger Lake) Integrated Graphics 以降向けの、オープンソースの OpenCL および oneAPI Level Zero 実装です。すべてのディスクリート Intel GPU も含まれます。
* {{AUR|intel-compute-runtime-legacy}}: 上記と同じですが、一部の oneAPI Level Zero サポートを含み、Intel Gen8 (Broadwell)、Gen9 (Skylake および派生)、Gen11 (Ice/Elkhart Lake) Graphics のみを対象とします。レガシープラットフォーム向けに提供される OpenCL ICD には "legacy1" という接尾辞があります。
* {{AUR|beignet}}: Intel Gen7 (Ivy Bridge) Graphics 以降向けのオープンソース OpenCL 実装です。Intel によって NEO OpenCL ランタイムを優先して非推奨となっていますが、レガシーハードウェアプラットフォーム (例: Ivy Bridge、Haswell) では推奨される解決策のままです。
* {{AUR|intel-opencl}}: Intel Gen7 (Ivy Bridge) Graphics 以降向けのプロプライエタリな OpenCL 実装です。Intel によって NEO OpenCL ランタイムを優先して非推奨となっていますが、レガシーハードウェアプラットフォーム (例: Ivy Bridge、Haswell) では推奨される解決策のままです。

==== CPU 上の OpenCL ====

以下により、OpenCL を CPU 上で実行できます:

* {{AUR|intel-opencl-runtime}}: x86_64 プロセッサ向けの、Intel の LLVM および oneAPI ベースの実装です。公式には Intel Core および Xeon プロセッサ向けですが、実際には SSE4.1 を備えたすべての x86_64 プロセッサで動作します。AMD Zen プロセッサ上でも pocl より高性能です。
* {{Pkg|pocl}}: LLVM ベースの OpenCL 実装で、LLVM がサポートするすべての CPU アーキテクチャ、一部の GPU (libCUDA 経由の Nvidia、Level Zero 経由の Intel)、および OpenASIP で動作します。この広い対応範囲にもかかわらず、性能はあまり良くありません。
* {{AUR|amdapp-sdk}}: AMD CPU ランタイム、放棄済み

==== Vulkan 上の OpenCL ====

以下により、OpenCL を Vulkan ランタイム上で実行できます:

* {{AUR|clspv-git}}: Clspv は、OpenCL C のサブセットを Vulkan compute shader に変換するプロトタイプコンパイラです。
* {{AUR|clvk-git}}: clvk は、コンパイラとして clspv を使用する、Vulkan 上の OpenCL 3.0 のプロトタイプ実装です。

==== FPGA 上の OpenCL ====

* OpenASIP 向けの pocl。上記を参照。
* {{AUR|xrt-bin}}: FPGA 向け Xilinx Run Time [https://github.com/Xilinx/XRT xrt]
* [https://github.com/intel/fpga-runtime-for-opencl fpga-runtime-for-opencl]: Intel FPGA Runtime

=== 32 ビットランタイム ===

OpenCL を使用する 32 ビットプログラムを'''実行'''するには、互換性のあるハードウェア向け 32 ビットランタイムをインストールする必要があります。

{{Tip|{{pkg|clinfo}} ユーティリティは、64 ビット OpenCL プラットフォーム、存在するデバイス、ICD loader のプロパティのみを一覧表示できます。
32 ビットについては、clinfo を 32 ビット向けにコンパイルするか、archlinux32 プロジェクトの 32 ビット版 [https://www.archlinux32.org/packages/i686/extra/clinfo/ clinfo] を使用する必要があります。}}

==== 汎用 GPU 上の OpenCL (32 ビット) ====

* {{Pkg|lib32-opencl-mesa}}: Mesa ドライバー向け OpenCL サポート (32 ビット)

==== NVIDIA GPU 上の OpenCL (32 ビット) ====

* {{Pkg|lib32-opencl-nvidia}}: NVIDIA 向け OpenCL 実装 (32 ビット)

=== 開発 ===

OpenCL '''開発'''に必要な最小限の追加パッケージは以下です:

* {{Pkg|ocl-icd}}: OpenCL ICD loader 実装。最新の OpenCL 仕様に対応しています。
* {{Pkg|opencl-headers}}: OpenCL C/C++ API ヘッダー。

ベンダーの SDK は、多数のツールとサポートライブラリを提供します:

* {{AUR|intel-opencl-sdk}}: [https://software.intel.com/en-us/articles/opencl-sdk/ Intel OpenCL SDK] (古いバージョン。新しい OpenCL SDK は INDE および Intel Media Server Studio に含まれています)
* {{AUR|amdapp-sdk}}: このパッケージは {{ic|/opt/AMDAPP}} としてインストールされ、SDK ファイルに加えて多数のコードサンプル ({{ic|/opt/AMDAPP/SDK/samples/}}) も含みます。また、システムに存在する OpenCL プラットフォームとデバイスを一覧表示し、それらの詳細情報を表示する {{ic|clinfo}} ユーティリティも提供します。SDK 自体に CPU OpenCL ドライバーが含まれているため、CPU デバイスで OpenCL を実行するための追加ドライバーは不要です (ベンダーに関係なく)。
* {{Pkg|rocm-opencl-sdk}}: AMD プラットフォーム向けの OpenCL ベースアプリケーションを開発します。
* {{Pkg|cuda}}: Nvidia の GPU SDK で、OpenCL 3.0 のサポートを含みます。

=== 言語バインディング ===

これらのバインディングにより、他の言語から OpenCL 環境を呼び出せます。通常、OpenCL C でカーネルを記述する必要性は変わりません。

* '''JavaScript/HTML5''': [https://www.khronos.org/webcl/ WebCL]
* [[Python]]: {{pkg|python-pyopencl}}
* [[D]]: [https://github.com/Trass3r/cl4d cl4d] または [https://github.com/libmir/dcompute DCompute]
* [[Java]]: [https://git.qoto.org/aparapi/aparapi Aparapi] または [https://jogamp.org/jocl/www/ JOCL] ([https://jogamp.org/ JogAmp] の一部)
* [[Mono|Mono/.NET]]: [https://sourceforge.net/projects/opentk/ Open Toolkit]
* [[Go]]: [https://github.com/samuel/go-opencl OpenCL bindings for Go]
* '''Racket''': Racket には [http://planet.racket-lang.org/display.ss?owner=jaymccarthy&package=opencl.plt PLaneT] 上のネイティブインターフェイスがあり、raco でインストールできます。
* [[Rust]]: [https://github.com/cogciprocate/ocl ocl]
* [[Julia]]: [https://github.com/JuliaGPU/OpenCL.jl OpenCL.jl]

== SYCL ==

[[Wikipedia:SYCL]] によると:

<blockquote>
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 を対象にします。
</blockquote>

言い換えると、SYCL は C++17 に基づくプログラミング環境を定義します。この環境は、CPU と GPGPU の両方に向けたコードを生成するコンパイラと組み合わせることを意図しています。GPGPU 側で使用される言語は以前は SPIR でしたが、他の中間表現を対象とするコンパイラも存在します。

=== 実装 ===

* {{AUR|trisycl-git}}: 主に Xilinx によって進められているオープンソース実装。
* {{AUR|adaptivecpp}}: すべてのベンダーの CPU と GPU 向けに、複数のプログラミングモデル (SYCL、C++ standard parallelism、HIP/CUDA) をサポートするコンパイラ。
* {{Pkg|intel-oneapi-dpcpp-cpp}}: Intel の Data Parallel C++。SYCL の LLVM/oneAPI 実装です。
* {{AUR|computecpp}} Codeplay のプロプライエタリな SYCL 1.2.1 実装。デバイスターゲットとして SPIR、SPIR-V、および実験的に PTX (NVIDIA) を対象にできます (2023 年 9 月 1 日にサポート終了。intel llvm 実装に統合される予定 [https://codeplay.com/portal/news/2023/07/07/the-future-of-computecpp Source])。

==== oneAPI ====

oneAPI は、Intel の多くの高性能コンピューティングライブラリで使用されるマーケティング名です。{{Pkg|intel-oneapi-dpcpp-cpp}} パッケージは {{ic|/opt/intel/oneapi/setvars.sh}} を提供し、SYCL プログラムのコンパイルとリンクのための環境設定に使用できます。コンパイラなどの一部コンポーネントは Intel により GitHub でオープンソース化されていますが、それ以外はそうではありません。

追加機能のためにインストールできるパッケージもあります。例えば、{{Pkg|intel-oneapi-mkl-sycl}} は Math Kernel Library (MKL) の GPU オフロードをサポートできるようにします。

==== SPIR サポートの確認 ====

SYCL はもともと [[Wikipedia:Standard Portable Intermediate Representation|SPIR または SPIR-V]] にコンパイルされることを意図していました。どちらも Khronos によって設計された中間言語で、OpenCL ドライバーが利用できます。SPIR は OpenCL 1.0 または 2.0 の拡張として含まれ、SPIR-V はバージョン 2.1 以降の OpenCL core に含まれています ({{ic|clCreateProgramWithIL}})。SPIR または SPIR-V がサポートされているか確認するには、{{pkg|clinfo}} を使用できます:

{{hc|head=$ clinfo {{!}} grep -i spir|output=
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 には、関連するシステム情報を要約するツールも同梱されています:

{{hc|$ 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 をサポートすることが知られているドライバーには、{{pkg|intel-compute-runtime}}、{{AUR|intel-opencl-runtime}}、{{Pkg|pocl}} があります。

===== SPIR/SPIR-V のその他の用途 =====

SPIR-V は計算カーネルだけでなく、グラフィックシェーダーも対象にします。OpenGL と Vulkan のシェーダー中間言語として、また OpenCL、Vulkan、SYCL の計算中間言語として機能できます。また、カーネルやシェーダーをある言語から別の言語へ変換する方法として、逆コンパイルすることもできます。

C++ for OpenCL 言語 (短命だった "OpenCL C++" と混同しないでください) は、C++17 と OpenCL C を組み合わせたものです。一部の OpenCL ドライバーは、OpenCL C と同じように {{ic|clBuildProgram()}} で直接ロードすることをサポートしていますが、主な想定用途は、まず {{ic|clang}} により SPIR-V へ変換することです。SYCL のモデル全体を採用せずに OpenCL カーネルを C++17 で記述したいプログラマにとって、選択肢となります。

=== 開発 ===

SYCL には、動作する C++11 環境の設定が必要です。

SYCL の C++17 言語で並列機能を利用するためのオープンソースライブラリがいくつかあります:

* [https://github.com/codeplaysoftware/computecpp-sdk/ ComputeCpp SDK]: コード例集、ComputeCpp 向け {{Pkg|cmake}} 統合
* [https://github.com/codeplaysoftware/SYCL-DNN SYCL-DNN]: ニューラルネットワーク性能プリミティブ
* [https://github.com/codeplaysoftware/SYCL-BLAS SYCL-BLAS]: 線形代数性能プリミティブ
* [https://github.com/codeplaysoftware/visioncpp VisionCpp]: Computer Vision ライブラリ
* [https://github.com/KhronosGroup/SyclParallelSTL SYCL Parallel STL]: C++17 並列アルゴリズムの GPU 実装

== CUDA ==

[[Wikipedia:CUDA|CUDA]] (Compute Unified Device Architecture) は、[[NVIDIA]] のプロプライエタリでクローズドソースの並列コンピューティングアーキテクチャおよびフレームワークです。NVIDIA GPU が必要で、いくつかのコンポーネントで構成されます:

* 必須:
** NVIDIA カーネルモジュール
** CUDA "driver" および "runtime" ライブラリ
* 任意:
** 追加ライブラリ: CUBLAS、CUFFT、CUSPARSE など
** {{ic|nvcc}} コンパイラを含む CUDA toolkit
** CUDA および OpenCL プログラムの多数のコードサンプルと例を含む CUDA SDK

カーネルモジュールと CUDA "driver" ライブラリは {{Pkg|nvidia-open}} と {{Pkg|opencl-nvidia}} に含まれています。"runtime" ライブラリと CUDA toolkit の残りは {{Pkg|cuda}} で利用できます。{{ic|cuda-gdb}} には {{aur|ncurses5-compat-libs}} のインストールが必要です。{{Bug|46598}} を参照してください。

=== 開発 ===

{{Pkg|cuda}} パッケージはすべてのコンポーネントを {{ic|/opt/cuda}} ディレクトリにインストールします。{{ic|/etc/profile.d/cuda.sh}} のスクリプトは関連する環境変数を設定し、CUDA をサポートするすべてのビルドシステムがそれを見つけられるようにします。

インストールが成功したか、CUDA が起動して動作しているかを確認するには、[https://github.com/nvidia/cuda-samples CUDA samples] をコンパイルできます。インストールを確認する方法の 1 つは、{{ic|deviceQuery}} サンプルを実行することです。

=== 言語バインディング ===

* '''Fortran''': [https://www.pgroup.com/resources/cudafortran.htm PGI CUDA Fortran Compiler]
* [[Haskell]]: [https://hackage.haskell.org/package/accelerate accelerate package] は利用可能な CUDA バックエンドを一覧しています
* [[Java]]: [http://www.jcuda.org/jcuda/JCuda.html JCuda]
* [[Mathematica]]: [https://reference.wolfram.com/mathematica/CUDALink/tutorial/Overview.html CUDAlink]
* [[Mono|Mono/.NET]]: [https://github.com/rapiddev/CUDAfy.NET CUDAfy.NET]、[https://github.com/kunzmi/managedCuda managedCuda]
* [[Perl]]: [https://metacpan.org/pod/KappaCUDA KappaCUDA]、[https://github.com/run4flat/perl-CUDA-Minimal CUDA-Minimal]
* [[Python]]: {{pkg|python-pycuda}}
* [[Ruby]]: [https://github.com/SciRuby/rbcuda rbcuda]
* [[Rust]]: [https://github.com/Rust-GPU/Rust-CUDA Rust-CUDA]。メンテナンスされていないもの: [https://github.com/rust-cuda/cuda-sys cuda-sys] (バインディング)、[https://github.com/bheisler/rustacuda RustaCUDA] (高水準ラッパー)。

== ROCm ==

ROCm [https://rocm.docs.amd.com/en/latest/ ROCm] (Radeon Open Compute Platform) は、AMD による CUDA への回答です。ドライバー (AMDGPU) からコンパイラ、ランタイムライブラリまで、CUDA と同様に多くのソフトウェア部品を含みます。一部は特定の AMD GPU 専用であり、他の部分は完全にハードウェア非依存です。詳細は [https://github.com/rocm-arch/rocm-arch ROCm for Arch Linux repository] を参照してください。

ROCm は、AMDGPU ドライバー上で compute capabilities を実装する単一のソフトウェアスタックを含みます。このスタックの上に、HIP、OpenMP、OpenCL を実装します。また、HIP の上に構築された一部の部品や、NVIDIA の CUDA stack を使用する HIP の実装も含みます。

=== ROCm 対応モデル ===

ROCm は Polaris アーキテクチャ (RX 500 シリーズ) 以降の AMD GPU をサポートするはずです。公式の [https://rocm.docs.amd.com/projects/install-on-linux/en/latest/reference/system-requirements.html GPU モデル一覧] は非常に短く、主にプロフェッショナルモデルで構成されています。しかし、同等世代のコンシューマー GPU や APU も動作することが知られています。他の世代は、非公式または部分的なサポートで動作する場合があります。Polaris をサポートするには、ランタイム変数 {{ic|1=ROC_ENABLE_PRE_VEGA=1}} を設定する必要があります。

新しい AMD GPU アーキテクチャが ROCm に追加されるまでには時間がかかります。最新のサポートマトリックスについては [[Wikipedia:ROCm#Consumer-grade GPUs]] を参照してください。また、前述の [[#OpenCL on AMD/ATI GPU]] も参照してください。

=== HIP ===

[https://rocm.docs.amd.com/projects/HIP/en/latest/ Heterogeneous Interface for Portability (HIP)] は、GPU ハードウェア上で高性能カーネルを設計するための AMD 専用 GPU プログラミング環境です。HIP は C++ runtime API およびプログラミング言語であり、開発者が異なるプラットフォーム上でポータブルなアプリケーションを作成できるようにします。

HIP の仕様は [https://github.com/ROCm/rocm-systems rocm-systems repository] で管理されていますが、HIP 自体はハードウェア非依存です。

HIP runtime library パッケージ:

* {{Pkg|rocm-hip-runtime}}: OpenCL ICD loader に相当する高水準ランタイムライブラリ。
* {{Pkg|hip-runtime-amd}}: AMD GPU 向け HIP 実装。
* {{Pkg|hip-runtime-nvidia}}: ROCm における NVIDIA GPU 向け Heterogeneous Interface。これは実際には、CUDA C++ コンパイラ向けのヘッダーファイル群であり、主に {{ic|#define}} によるリネームで構成されています。

{{Pkg|rocm-hip-sdk}} パッケージには HIP SDK が含まれています。すべてのコンポーネントは {{ic|/opt/rocm}} ディレクトリにインストールされます。関連する環境変数を設定するスクリプトは {{ic|/etc/profile.d/rocm.sh}} で提供されます。一部のソフトウェアは {{ic|HIP_PATH}} も確認する場合があり、これは {{ic|ROCM_PATH}} と同じ値に手動で設定できます。

{{Pkg|miopen-hip}} は、AMD のオープンソース深層学習ライブラリ向け HIP バックエンドです。

=== ROCm トラブルシューティング ===

まず、{{ic|/opt/rocm/bin/rocminfo}} に GPU が表示されるか確認してください。表示されない場合、その GPU が ROCm にサポートされていないか、GPU のサポートなしでビルドされている可能性があります。

デバッグや GPU isolation などについては、[https://rocm.docs.amd.com/en/latest/conceptual/gpu-isolation.html ROCm HIP environment variables] も確認してください。

== OpenMP と OpenACC ==

OpenMP は CPU multiprocessing での利用でよく知られていますが、一部の作業を GPGPU に移すための offloading もサポートしています。OpenACC も似た位置づけです。どちらも通常の C/C++/Fortran コードに pragma を挿入し、コンパイラがマークされた部分を offloading または multiprocessing 用に分離する仕組みに基づいています。

* AMD は ROCm 対応 AMD GPU 向けの OpenMP 実装を提供しています。{{AUR|openmp-extras}} パッケージは、AMD GPU 上の OpenMP API に対する追加サポートを備えたオープンソースの Clang/LLVM ベースコンパイラである [https://github.com/ROCm-Developer-Tools/aomp AOMP] を提供します。
* Nvidia の {{Pkg|nvhpc}} は、同社 GPU 上での GPU offloading を伴う OpenMP 実装を提供します。[https://docs.nvidia.com/hpc-sdk/compilers/hpc-compilers-user-guide/index.html#using-openmp]
* GCC は、OpenMP および OpenACC の offloading 用に Nvidia (nvptx) と AMD (gfx9、gfx10、gfx11) のコードを生成できます [https://gcc.gnu.org/wiki/Offloading]。
* Clang/LLVM は、OpenMP および OpenACC の offloading 用に Nvidia (nvptx) と AMD (amdgpu) のコードを生成できます [https://clang.llvm.org/docs/OffloadingDesign.html] [https://clang.llvm.org/docs/ClangOffloadBundler.html]。

== GPGPU アクセラレーション対応ソフトウェア一覧 ==

{{Expansion|GPGPU をサポートするアプリケーションはさらに存在する可能性があります。}}

* [[Bitcoin]]
* [[Blender]] – Nvidia GPU 向け CUDA サポートと AMD GPU 向け HIP サポート。詳細は [https://docs.blender.org/manual/en/latest/render/cycles/gpu_rendering.html] を参照してください。
* [[BOINC]] – 一部のプロジェクトは OpenCL および/または CUDA プログラムを提供しています
* {{AUR|cuda_memtest}} – GPU memtest。名前にもかかわらず、CUDA と OpenCL の両方をサポートしています。
* {{Pkg|darktable}} – OpenCL 機能には、GPU 上に少なくとも 1 GB RAM と ''Image support'' が必要です (clinfo コマンドの出力を確認してください)。
* [[DaVinci Resolve]] - ノンリニア動画編集ソフト。OpenCL と CUDA の両方を使用できます。
* [[FFmpeg]] – 詳細は [https://trac.ffmpeg.org/wiki/HWAccelIntro#OpenCL] を参照してください。
** [[HandBrake]]
* [[Folding@home]] – 分子シミュレーションソフトウェア GROMACS の OpenCL 版と CUDA 版を使用します
* [[GIMP]] – 実験的 – 詳細は [https://www.h-online.com/open/news/item/GIMP-2-8-RC-1-arrives-with-GPU-acceleration-1518417.html] を参照してください。
* [[Hashcat]]
* {{Pkg|imagemagick}}
* [[LibreOffice]] Calc – 詳細は [https://help.libreoffice.org/Calc/OpenCL_Options] を参照してください。
* [[mpv]] - [[mpv#Hardware video acceleration]] を参照してください。
* {{AUR|lc0}} - ニューラルネットワークの探索に使用されます (tensorflow、OpenCL、CUDA、openblas をサポート)
* [https://github.com/ProjectPhysX/OpenCL-Benchmark opencl-benchmark] - OpenCL 向けの単純な FP64/FP32/FP16/INT64/INT32/INT16/INT8 およびメモリ/PCIe 帯域幅ベンチマークツール
* {{Pkg|opencv}}
* [[Ollama]] - LLM 推論ソフトウェア
* [[llama.cpp]] - C/C++ による LLM 推論
* {{AUR|pyrit}}
* {{Pkg|python-pytorch-cuda}}, {{Pkg|python-pytorch-rocm}}
* {{Pkg|tensorflow-cuda}}, {{AUR|tensorflow-computecpp}}
* {{Pkg|xmrig}} - High Perf CryptoNote CPU および GPU (OpenCL、CUDA) miner

=== ROCm 上の PyTorch ===

ROCm で PyTorch を使用するには、{{Pkg|python-pytorch-rocm}} をインストールしてください。

{{hc|$ python -c 'import torch; print(torch.cuda.is_available())'|
True
}}

ROCm は CUDA のふりをするため、これは {{ic|True}} を返すはずです。返さない場合、GPU サポート付きでコンパイルされていないか、依存関係が競合している可能性があります。{{ic|ldd /usr/lib/libtorch.so}} を確認することで検証できます。欠落している {{ic|.so}} ファイルや、同じ {{ic|.so}} の複数バージョンが存在してはいけません。

== 参照 ==

* [https://www.khronos.org/opencl/ OpenCL official homepage]
* [https://www.khronos.org/sycl/ SYCL official homepage]
* [https://www.khronos.org/spir/ SPIR official homepage]
* [https://developer.nvidia.com/cuda-toolkit CUDA Toolkit homepage]
* [https://software.intel.com/en-us/intel-opencl Intel SDK for OpenCL Applications homepage]
* [https://gitlab.com/illwieckz/i-love-compute List of OpenCL frameworks applicable for different GPUs]

2026年5月4日 (月) 21:18時点における最新版

転送先: