「GPGPU」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎開発: 同期)
(tensorflow-opt-cuda パッケージ追加→‎GPGPU のアクセラレーションがあるソフトウェア)
(3人の利用者による、間の12版が非表示)
14行目: 14行目:
   
 
OpenCL の仕様書には一般環境として必要なプログラミング言語と、プログラマーがこの環境で呼び出せる C API が書かれています。
 
OpenCL の仕様書には一般環境として必要なプログラミング言語と、プログラマーがこの環境で呼び出せる C API が書かれています。
  +
  +
{{Tip|{{pkg|clinfo}} ユーティリティを使うことで OpenCL プラットフォームと存在するデバイス、ICD ローダーのプロパティを確認できます。}}
   
 
===OpenCL ランタイム===
 
===OpenCL ランタイム===
21行目: 23行目:
 
* {{Pkg|opencl-mesa}}: [[AMDGPU]] と [[Radeon]] 用のフリーなランタイム。
 
* {{Pkg|opencl-mesa}}: [[AMDGPU]] と [[Radeon]] 用のフリーなランタイム。
 
* {{AUR|opencl-amd}}: [[AMDGPU]] 用のプロプライエタリなスタンドアロンのランタイム。
 
* {{AUR|opencl-amd}}: [[AMDGPU]] 用のプロプライエタリなスタンドアロンのランタイム。
  +
* {{AUR|rocm-opencl-runtime}}: AMD の完全なオープンソースの ROCm GPU 計算スタックに含まれます。GFX8 以降のカードに対応 (Fiji, Polaris, Vega)。
* {{AUR|amdgpu-pro-opencl}}: [[AMDGPU PRO]] 用のプロプライエタリなランタイム。
 
  +
* {{AUR|opencl-amdgpu-pro-orca}}: [[AMDGPU PRO]] 用のプロプライエタリなランタイム (Vega 10 よりも古い製品をサポート)。
  +
* {{AUR|opencl-amdgpu-pro-pal}}: [[AMDGPU PRO]] 用のプロプライエタリなランタイム (Vega 10 以降の新しい製品をサポート)。
 
* {{AUR|opencl-catalyst}}: AMD のプロプライエタリなランタイム。[[AMDGPU]] に取って代わられる予定です。
 
* {{AUR|opencl-catalyst}}: AMD のプロプライエタリなランタイム。[[AMDGPU]] に取って代わられる予定です。
 
* {{AUR|amdapp-sdk}}: AMD CPU ランタイム。
 
* {{AUR|amdapp-sdk}}: AMD CPU ランタイム。
29行目: 33行目:
   
 
====Intel====
 
====Intel====
* {{AUR|intel-opencl-runtime}}: 公式 Intel CPU ランタイム。IntelCPU もサポトしています
+
* {{pkg|intel-compute-runtime}}: 別名 Neo OpenCL ランタイム。Gen8 (Broadwell)Intel HD Graphics GPU 用のオープンソス実装
* {{pkg|beignet}}: Intel IvyBridge 以上の iGPU 用のオープンソース実装。
+
* {{pkg|beignet}}: Intel IvyBridge 以上の iGPU 用のオープンソース実装。古いプラットフォーム向け (例: Ivy Bridge, Sandy Bridge, Haswell)
  +
* {{AUR|intel-opencl}}: Intel IvyBridge 以上の iGPU 用のプロプライエタリ実装。古いプラットフォーム向け (例: Ivy Bridge, Sandy Bridge, Haswell)。
  +
* {{AUR|intel-opencl-runtime}}: Intel Core と Xeon プロセッサ向けの実装。Intel 製以外の CPU もサポート。
   
 
====その他====
 
====その他====
49行目: 55行目:
 
* {{Pkg|ocl-icd}}: 推奨、基本的に最新です。
 
* {{Pkg|ocl-icd}}: 推奨、基本的に最新です。
 
* AMD による {{AUR|libopencl}}: OpenCL のバージョン 2.0 を提供します。目下 AMD によって制限的なライセンスで配布されているため、公式リポジトリに入れることはできません。
 
* AMD による {{AUR|libopencl}}: OpenCL のバージョン 2.0 を提供します。目下 AMD によって制限的なライセンスで配布されているため、公式リポジトリに入れることはできません。
* Intel による {{AUR|intel-opencl-runtime}}: OpenCL 2.0 を提供します。
+
* Intel による {{AUR|intel-opencl}}: OpenCL 2.0 を提供します。{{pkg|intel-compute-runtime}} によって廃止予定
   
 
{{Note|ICD ローダーのベンダーの名前が出るのはローダーを識別する必要があるときだけです。他の場合、ベンダーの名前は関係ありません。ICD ローダーはベンダーに依存しないため (正しく実装されてさえいれば) 相互に交換して使うことができます。}}
 
{{Note|ICD ローダーのベンダーの名前が出るのはローダーを識別する必要があるときだけです。他の場合、ベンダーの名前は関係ありません。ICD ローダーはベンダーに依存しないため (正しく実装されてさえいれば) 相互に交換して使うことができます。}}
59行目: 65行目:
   
 
ベンダーの SDK には様々なツールやサポートライブラリが含まれています:
 
ベンダーの SDK には様々なツールやサポートライブラリが含まれています:
* {{AUR|intel-opencl-sdk}}: [http://software.intel.com/en-us/articles/opencl-sdk/ Intel の OpenCL SDK] (旧バージョン、最新の OpenCL SDK は INDE や Intel Media Server Studio に含まれています)
+
* {{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}} ユーティリティが含まれています。[http://developer.amd.com/sdks/AMDAPPSDK/Pages/default.aspx AMD APP SDK] には CPU OpenCL ドライバーが含まれているため、CPU デバイスで OpenCL を実行するのに追加のドライバーは必要ありません (AMD 製じゃなくても動作します)。GPU の OpenCL ドライバーは {{AUR|catalyst}} パッケージに入っています。
 
* {{AUR|amdapp-sdk}}: このパッケージでは {{ic|/opt/AMDAPP}} にファイルがインストールされ、SDK ファイルの他にコードサンプルが大量に同梱されています ({{ic|/opt/AMDAPP/SDK/samples/}})。システム内の OpenCL プラットフォームやデバイスを確認したり詳細情報を表示できる {{ic|clinfo}} ユーティリティが含まれています。[http://developer.amd.com/sdks/AMDAPPSDK/Pages/default.aspx AMD APP SDK] には CPU OpenCL ドライバーが含まれているため、CPU デバイスで OpenCL を実行するのに追加のドライバーは必要ありません (AMD 製じゃなくても動作します)。GPU の OpenCL ドライバーは {{AUR|catalyst}} パッケージに入っています。
 
* {{Pkg|cuda}}: NVidia の GPU SDK、OpenCL 1.1 のサポートを含んでいます。
 
* {{Pkg|cuda}}: NVidia の GPU SDK、OpenCL 1.1 のサポートを含んでいます。
66行目: 72行目:
 
あなたの環境で有効になっている OpenCL 実装を確認するには、次のコマンドを使います:
 
あなたの環境で有効になっている OpenCL 実装を確認するには、次のコマンドを使います:
 
$ ls /etc/OpenCL/vendors
 
$ ls /etc/OpenCL/vendors
  +
  +
OpenCL プラットフォームとデバイスの利用可能な (既知の) プロパティを確認するには {{pkg|clinfo}} を[[インストール]]してください。
   
 
====言語バインディング====
 
====言語バインディング====
71行目: 79行目:
 
* C++/Qt: Qt Labs に [http://qt.gitorious.org/qt-labs/opencl QtOpenCL] という名前の実験的なバインディングがあります - 詳しくは [http://labs.qt.nokia.com/2010/04/07/using-opencl-with-qt/ ブログエントリ] を参照
 
* C++/Qt: Qt Labs に [http://qt.gitorious.org/qt-labs/opencl QtOpenCL] という名前の実験的なバインディングがあります - 詳しくは [http://labs.qt.nokia.com/2010/04/07/using-opencl-with-qt/ ブログエントリ] を参照
 
* JavaScript/HTML5: [http://www.khronos.org/webcl/ WebCL]
 
* JavaScript/HTML5: [http://www.khronos.org/webcl/ WebCL]
* [[Python]]: PyOpenCL という同じ名前を持った2つのバインディングが存在します。片方は [extra] に入っています: {{pkg|python-pyopencl}}。もう片方については [http://sourceforge.net/projects/pyopencl/ sourceforge] を見て下さい。
+
* [[Python]]: PyOpenCL という同じ名前を持った2つのバインディングが存在します。片方は [extra] に入っています: {{pkg|python-pyopencl}}。もう片方については [https://sourceforge.net/projects/pyopencl/ sourceforge] を見て下さい。
 
* [[D]]: [https://bitbucket.org/trass3r/cl4d/wiki/Home cl4d]
 
* [[D]]: [https://bitbucket.org/trass3r/cl4d/wiki/Home cl4d]
* [[Haskell]]: OpenCLRaw パッケージを AUR からインストールできます: {{AUR|haskell-openclraw-git}}{{Broken package link|{{aur-mirror|haskell-openclraw-git}}}}
 
 
* [[Java]]: [http://jogamp.org/jocl/www/ JOCL] ([http://jogamp.org/ JogAmp] の一部)
 
* [[Java]]: [http://jogamp.org/jocl/www/ JOCL] ([http://jogamp.org/ JogAmp] の一部)
* [[Mono|Mono/.NET]]: [http://sourceforge.net/projects/opentk/ Open Toolkit]
+
* [[Mono|Mono/.NET]]: [https://sourceforge.net/projects/opentk/ Open Toolkit]
 
* [[Go]]: [https://github.com/samuel/go-opencl OpenCL bindings for Go]
 
* [[Go]]: [https://github.com/samuel/go-opencl OpenCL bindings for Go]
 
* Racket: raco でインストールすることができるネイティブインターフェイスが [http://planet.racket-lang.org/display.ss?owner=jaymccarthy&package=opencl.plt PLaneT] にあります。
 
* Racket: raco でインストールすることができるネイティブインターフェイスが [http://planet.racket-lang.org/display.ss?owner=jaymccarthy&package=opencl.plt PLaneT] にあります。
 
* [[Rust]]: [https://github.com/cogciprocate/ocl ocl]
 
* [[Rust]]: [https://github.com/cogciprocate/ocl ocl]
  +
* [[Julia]]: [https://github.com/JuliaGPU/OpenCL.jl OpenCL.jl]
  +
  +
==SYCL==
  +
[[Wikipedia:SYCL|SYCL]] は Khronos Group によって作られたオープン・ロイヤルティフリーな標準で、OpenCL 1.2 に基づく C++ によるシングルソースのヘテロジニアスプログラミングモデルを定義しています。
  +
  +
SYCL はランタイム部分と C++ デバイスコンパイラから構成されます。デバイスコンパイラはあらゆる種類のアクセラレータを対象とします。ランタイムは OpenCL 実装が存在しない場合に CPU コードパスにフォールバックするために必要となります。
  +
  +
===実装===
  +
* {{AUR|computecpp}}: Codeplay による SYCL 1.2.1 のプロプライエタリ実装。SPIR, SPIR-V を対象とし、実験的なデバイスターゲットとして PTX (NVIDIA) にも対応。
  +
* {{AUR|trisycl-git}}: Xilinx によって開発されているオープンソースの実装。
  +
* {{AUR|hipsycl-cuda-git}} と {{AUR|hipsycl-rocm-git}}: OpenCL の代わりに AMD の HIP を使用するフリー実装。AMD と NVIDIA の GPU で動作可能。
  +
  +
===SPIR サポートの確認===
  +
大抵の SYCL 実装はアクセラレータのコードを [[Wikipedia:Standard Portable Intermediate Representation|SPIR]] あるいは [[Wikipedia:Standard Portable Intermediate Representation|SPIR-V]] にコンパイルすることができます。どちらも Khronos によって設計された中間言語で、OpenCL ドライバーに渡すことができます。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}}, {{AUR|pocl}}, {{AUR|amdgpu-pro-opencl}}{{Broken package link|パッケージが存在しません}} などが存在します。
  +
  +
===SYCL 開発===
  +
SYCL を使うには C++11 環境が必要です。少数ながらオープンソースのライブラリが存在します:
  +
* [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]: コンピュータビジョンライブラリ
  +
* [https://github.com/KhronosGroup/SyclParallelSTL SYCL Parallel STL]: C++17 並列アルゴリズムの GPU 実装
   
 
==CUDA==
 
==CUDA==
91行目: 140行目:
 
** CUDA SDK。CUDA と OpenCL のプログラムの多数のサンプルやコードが含まれています。
 
** CUDA SDK。CUDA と OpenCL のプログラムの多数のサンプルやコードが含まれています。
   
カーネルモジュールと CUDA の "driver" ライブラリは {{Pkg|nvidia}} と {{Pkg|opencl-nvidia}} に入っています。"runtime" ライブラリと CUDA ツールキットは {{Pkg|cuda}} パッケージでインストール可能です。このライブラリは[https://projects.archlinux.org/svntogit/community.git/commit/trunk?h=packages/cuda&id=1b62c8bcb9194b2de1b750bd62a8dce1e7e549f5 64ビット版]だけが存在します。{{ic|cuda-gdb}} を使うには {{aur|ncurses5-compat-libs}} のインストールが必要です。{{Bug|46598}} を参照。
+
カーネルモジュールと CUDA の "driver" ライブラリは {{Pkg|nvidia}} と {{Pkg|opencl-nvidia}} に入っています。"runtime" ライブラリと CUDA ツールキットは {{Pkg|cuda}} パッケージでインストール可能です。{{ic|cuda-gdb}} を使うには {{aur|ncurses5-compat-libs}} のインストールが必要です。{{Bug|46598}} を参照。
   
 
===開発===
 
===開発===
98行目: 147行目:
   
 
{{ic|/opt/cuda/samples}} にインストールされたサンプルをコンパイルしてコンパイルされたサンプルを実行することで、インストールが成功したこと、CUDA が動作していることを確認できます (サンプルディレクトリで {{ic|make}} を実行するだけでコンパイルできます、ただし、コンパイルする前に {{ic|/opt/cuda/samples}} ディレクトリをホームディレクトリにコピーしておいた方が良いでしょう)。インストールが問題ないことを確認するときは {{ic|deviceQuery}} と呼ばれるサンプルのどれかを実行するのがふさわしいと思われます。
 
{{ic|/opt/cuda/samples}} にインストールされたサンプルをコンパイルしてコンパイルされたサンプルを実行することで、インストールが成功したこと、CUDA が動作していることを確認できます (サンプルディレクトリで {{ic|make}} を実行するだけでコンパイルできます、ただし、コンパイルする前に {{ic|/opt/cuda/samples}} ディレクトリをホームディレクトリにコピーしておいた方が良いでしょう)。インストールが問題ないことを確認するときは {{ic|deviceQuery}} と呼ばれるサンプルのどれかを実行するのがふさわしいと思われます。
 
{{Note|CUDA 9.0 は GCC 7 と互換性がありません ({{Bug|49272}} を参照)。したがって {{Pkg|cuda}} パッケージは {{Pkg|gcc6}} に依存しており、{{ic|nvcc}} から古いバージョンが使われるように {{ic|/opt/cuda/bin/}} にシンボリックリンクが作成されます。ホストコードをコンパイルする際は同じバージョンの GCC が使われるようにビルドシステムを設定する必要があります。}}
 
   
 
===言語バインディング===
 
===言語バインディング===
 
* Fortran: [http://www.pgroup.com/resources/cudafortran.htm PGI CUDA Fortran Compiler]
 
* Fortran: [http://www.pgroup.com/resources/cudafortran.htm PGI CUDA Fortran Compiler]
* [[Haskell]]: [http://hackage.haskell.org/package/accelerate accelerate パッケージ] に CUDA バックエンドがあります
+
* [[Haskell]]: [https://hackage.haskell.org/package/accelerate accelerate パッケージ] に CUDA バックエンドがあります
 
* [[Java]]: [http://www.jcuda.org/jcuda/JCuda.html JCuda]
 
* [[Java]]: [http://www.jcuda.org/jcuda/JCuda.html JCuda]
 
* [[Mathematica]]: [http://reference.wolfram.com/mathematica/CUDALink/tutorial/Overview.html CUDAlink]
 
* [[Mathematica]]: [http://reference.wolfram.com/mathematica/CUDALink/tutorial/Overview.html CUDAlink]
 
* [[Mono|Mono/.NET]]: [http://www.hoopoe-cloud.com/Solutions/CUDA.NET/Default.aspx CUDA.NET], [http://www.hybriddsp.com/ CUDAfy.NET]
 
* [[Mono|Mono/.NET]]: [http://www.hoopoe-cloud.com/Solutions/CUDA.NET/Default.aspx CUDA.NET], [http://www.hybriddsp.com/ CUDAfy.NET]
* Perl: [http://psilambda.com/download/kappa-for-perl Kappa], [https://github.com/run4flat/perl-CUDA-Minimal CUDA-Minimal]
+
* [[Perl]]: [https://metacpan.org/pod/KappaCUDA KappaCUDA], [https://github.com/run4flat/perl-CUDA-Minimal CUDA-Minimal]
 
* [[Python]]: {{pkg|python-pycuda}} または [http://psilambda.com/download/kappa-for-python Kappa]
 
* [[Python]]: {{pkg|python-pycuda}} または [http://psilambda.com/download/kappa-for-python Kappa]
 
* [[Ruby]], Lua: [http://psilambda.com/products/kappa/ Kappa]
 
* [[Ruby]], Lua: [http://psilambda.com/products/kappa/ Kappa]
   
  +
==GPGPU のアクセラレーションがあるソフトウェア==
===ドライバーの問題===
 
 
複数の GPU が載っている環境で CUDA プログラムを実行する場合、パーミッション問題を解決するためにレガシーなドライバー {{Pkg|nvidia-304xx}} または {{Pkg|nvidia-304xx-lts}} を使う必要があるかもしれません。
 
 
==OpenCL と CUDA のアクセラレーションがあるソフトウェア==
 
 
* [[Bitcoin]]
 
* [[Bitcoin]]
  +
* [[Blender]] - Nvidia GPU 向けの CUDA のサポートと AMD GPU 向けの OpenCL のサポート。詳細は[http://blender.org/manual/render/cycles/features.html#features こちら]。
  +
* [[BOINC]]
  +
* [[DaVinci Resolve]] - ノンリニア動画エディタ。OpenCL と CUDA の両方を使います。
  +
* [[FFmpeg]] – 詳しくは [https://trac.ffmpeg.org/wiki/HWAccelIntro#OpenCL こちら] を参照。
  +
* [[GIMP]] (実験段階 - [http://www.h-online.com/open/news/item/GIMP-2-8-RC-1-arrives-with-GPU-acceleration-1518417.html] を参照)
 
* [[HandBrake]]
 
* [[HandBrake]]
  +
* [[Hashcat]]
* [[GIMP]] (実験段階 - [http://www.h-online.com/open/news/item/GIMP-2-8-RC-1-arrives-with-GPU-acceleration-1518417.html] を参照)
 
  +
* [[LibreOffice]] Calc – [https://help.libreoffice.org/Calc/OpenCL_Options こちら] を参照。
  +
* {{Pkg|clinfo}} – システムの OpenCL プラットフォーム・デバイスのプロパティを確認。
  +
* {{AUR|cuda_memtest}} - GPU memtest。名前とは裏腹に、CUDA と OpenCL の両方をサポートしています。
  +
* {{Pkg|darktable}} - OpenCL 機能を使うには GPU に最低でも 1GB のメモリが搭載されていて ''Image support'' が必要です (clinfo コマンドの出力で確認できます)。
  +
* {{Pkg|imagemagick}}
  +
* {{AUR|lc0}} - ニューラルネットワークの検索に使います (tensorflow, OpenCL, CUDA, openblas に対応)。
 
* {{Pkg|opencv}}
 
* {{Pkg|opencv}}
 
* {{Pkg|pyrit}}
 
* {{Pkg|pyrit}}
  +
* {{Pkg|tensorflow-cuda}} および {{Pkg|tensorflow-opt-cuda}} - TensorFlow の CUDA 移植
* {{Pkg|darktable}} - OpenCL 機能を使うには GPU に最低でも 1GB のメモリが搭載されていて ''Image support'' が必要です (clinfo コマンドの出力で確認できます)。
 
  +
* {{AUR|tensorflow-computecpp}} - TensorFlow の SYCL 移植
* {{Pkg|aircrack-ng}}
 
* {{AUR|cuda_memtest}} - GPU memtest。名前とは裏腹に、CUDA と OpenCL の両方をサポートしています。
 
* [[Blender]] - Nvidia GPU 向けの CUDA のサポートと AMD GPU 向けの OpenCL のサポート。詳細は[http://blender.org/manual/render/cycles/features.html#features こちら]。
 
* [[BOINC]]
 
   
 
==参照==
 
==参照==
 
* [http://www.khronos.org/opencl/ OpenCL 公式ホームページ]
 
* [http://www.khronos.org/opencl/ OpenCL 公式ホームページ]
* [http://www.nvidia.com/object/cuda_home_new.html CUDA 公式ホームページ]
+
* [https://www.khronos.org/sycl/ SYCL 公式ホームページ]
* [http://www.khronos.org/registry/cl/extensions/khr/cl_khr_icd.txt The ICD extension specification]
+
* [https://www.khronos.org/spir/ SPIR 公式ホームページ]
  +
* [https://www.nvidia.com/object/cuda_home_new.html CUDA 公式ホームページ]
  +
* [http://www.khronos.org/registry/cl/extensions/khr/cl_khr_icd.txt ICD 拡張仕様]
 
* [http://developer.amd.com/appsdk AMD APP SDK ホームページ]
 
* [http://developer.amd.com/appsdk AMD APP SDK ホームページ]
 
* [https://developer.nvidia.com/cuda-toolkit CUDA Toolkit ホームページ]
 
* [https://developer.nvidia.com/cuda-toolkit CUDA Toolkit ホームページ]
 
* [https://software.intel.com/en-us/intel-opencl Intel OpenCL SDK ホームページ]
 
* [https://software.intel.com/en-us/intel-opencl Intel OpenCL SDK ホームページ]
  +
* [https://developer.codeplay.com/home/ ComputeCpp 公式ホームページ]

2020年2月17日 (月) 22:35時点における版

関連記事

GPGPU は General-purpose computing on graphics processing units の略で GPU による汎目的計算を意味します。Linux では、現在2つの GPGPU フレームワークが存在します: OpenCLCUDA

OpenCL

OpenCL (Open Computing Language) は非営利団体である Khronos グループによって開発されている、オープンでロイヤルティフリーの並列プログラミングフレームワークです。

OpenCL の仕様書には一般環境として必要なプログラミング言語と、プログラマーがこの環境で呼び出せる C API が書かれています。

ヒント: clinfo ユーティリティを使うことで OpenCL プラットフォームと存在するデバイス、ICD ローダーのプロパティを確認できます。

OpenCL ランタイム

OpenCL を使用するプログラムを実行するには、ハードウェアに対応したランタイムをインストールする必要があります。

AMD/ATI

  • opencl-mesa: AMDGPURadeon 用のフリーなランタイム。
  • opencl-amdAUR: AMDGPU 用のプロプライエタリなスタンドアロンのランタイム。
  • rocm-opencl-runtimeAUR: AMD の完全なオープンソースの ROCm GPU 計算スタックに含まれます。GFX8 以降のカードに対応 (Fiji, Polaris, Vega)。
  • opencl-amdgpu-pro-orcaAUR: AMDGPU PRO 用のプロプライエタリなランタイム (Vega 10 よりも古い製品をサポート)。
  • opencl-amdgpu-pro-palAUR: AMDGPU PRO 用のプロプライエタリなランタイム (Vega 10 以降の新しい製品をサポート)。
  • opencl-catalystAUR: AMD のプロプライエタリなランタイム。AMDGPU に取って代わられる予定です。
  • amdapp-sdkAUR: AMD CPU ランタイム。

NVIDIA

Intel

  • intel-compute-runtime: 別名 Neo OpenCL ランタイム。Gen8 (Broadwell) 以降の Intel HD Graphics GPU 用のオープンソース実装。
  • beignet: Intel IvyBridge 以上の iGPU 用のオープンソース実装。古いプラットフォーム向け (例: Ivy Bridge, Sandy Bridge, Haswell)。
  • intel-openclAUR: Intel IvyBridge 以上の iGPU 用のプロプライエタリ実装。古いプラットフォーム向け (例: Ivy Bridge, Sandy Bridge, Haswell)。
  • intel-opencl-runtimeAUR: Intel Core と Xeon プロセッサ向けの実装。Intel 製以外の CPU もサポート。

その他

  • poclAUR: LLVM ベースの OpenCL 実装。

OpenCL ICD ローダー (libOpenCL.so)

OpenCL ICD ローダーはプラットフォームに依存しないライブラリで、OpenCL API 経由で特定のデバイスのドライバーをロードするのに使われます。ほとんどの OpenCL ベンダーはそれぞれ独自の OpenCL ICD ローダーを提供しており、他のベンダーの OpenCL 実装でも問題なく動作するはずです。残念ながら、大抵のベンダーは最新の ICD ローダーを提供していません。そのため、Arch Linux ではこのライブラリを別のプロジェクトから用意することで (ocl-icd) 最新の OpenCL API の実装が機能するようにしています。

他の ICD ローダーライブラリは各メーカーの SDK の一部としてインストールされます。確実に ocl-icd パッケージに含まれている ICD ローダーを使用したい場合、/etc/ld.so.conf.d にファイルを作成して /usr/lib を動的プログラムローダーの検索ディレクトリに追加します:

/etc/ld.so.conf.d/00-usrlib.conf
/usr/lib

全ての SDK は ld.so.conf.d ファイルでランタイムのライブラリディレクトリを検索パスに追加するため上記の設定をする必要があります。

様々な OpenCL ICD が含まれているパッケージ:

  • ocl-icd: 推奨、基本的に最新です。
  • AMD による libopenclAUR: OpenCL のバージョン 2.0 を提供します。目下 AMD によって制限的なライセンスで配布されているため、公式リポジトリに入れることはできません。
  • Intel による intel-openclAUR: OpenCL 2.0 を提供します。intel-compute-runtime によって廃止予定。
ノート: ICD ローダーのベンダーの名前が出るのはローダーを識別する必要があるときだけです。他の場合、ベンダーの名前は関係ありません。ICD ローダーはベンダーに依存しないため (正しく実装されてさえいれば) 相互に交換して使うことができます。

OpenCL 開発

OpenCL を使用して開発をしたい場合、最低でも以下のパッケージが必要になります:

  • ocl-icd: OpenCL ICD ローダーの実装、最新の 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 ユーティリティが含まれています。AMD APP SDK には CPU OpenCL ドライバーが含まれているため、CPU デバイスで OpenCL を実行するのに追加のドライバーは必要ありません (AMD 製じゃなくても動作します)。GPU の OpenCL ドライバーは catalystAUR パッケージに入っています。
  • cuda: NVidia の GPU SDK、OpenCL 1.1 のサポートを含んでいます。

実装

あなたの環境で有効になっている OpenCL 実装を確認するには、次のコマンドを使います:

$ ls /etc/OpenCL/vendors

OpenCL プラットフォームとデバイスの利用可能な (既知の) プロパティを確認するには clinfoインストールしてください。

言語バインディング

SYCL

SYCL は Khronos Group によって作られたオープン・ロイヤルティフリーな標準で、OpenCL 1.2 に基づく C++ によるシングルソースのヘテロジニアスプログラミングモデルを定義しています。

SYCL はランタイム部分と C++ デバイスコンパイラから構成されます。デバイスコンパイラはあらゆる種類のアクセラレータを対象とします。ランタイムは OpenCL 実装が存在しない場合に CPU コードパスにフォールバックするために必要となります。

実装

  • computecppAUR: Codeplay による SYCL 1.2.1 のプロプライエタリ実装。SPIR, SPIR-V を対象とし、実験的なデバイスターゲットとして PTX (NVIDIA) にも対応。
  • trisycl-gitAUR: Xilinx によって開発されているオープンソースの実装。
  • hipsycl-cuda-gitAURhipsycl-rocm-gitAUR: OpenCL の代わりに AMD の HIP を使用するフリー実装。AMD と NVIDIA の GPU で動作可能。

SPIR サポートの確認

大抵の SYCL 実装はアクセラレータのコードを SPIR あるいは SPIR-V にコンパイルすることができます。どちらも Khronos によって設計された中間言語で、OpenCL ドライバーに渡すことができます。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, poclAUR, amdgpu-pro-openclAUR[リンク切れ: パッケージが存在しません] などが存在します。

SYCL 開発

SYCL を使うには C++11 環境が必要です。少数ながらオープンソースのライブラリが存在します:

  • ComputeCpp SDK: コードサンプル集や ComputeCpp のcmake 統合
  • SYCL-DNN: ニューラルネットワークパフォーマンスプリミティブ
  • SYCL-BLAS: 線形代数パフォーマンスプリミティブ
  • VisionCpp: コンピュータビジョンライブラリ
  • SYCL Parallel STL: C++17 並列アルゴリズムの GPU 実装

CUDA

CUDA (Compute Unified Device Architecture) は NVIDIA による、プロプライエタリでクローズドソースの並列計算アーキテクチャ・フレームワークです。NVIDIA の GPU を必要とします。CUDA は複数のコンポーネントから構成されます:

  • 必須:
    • プロプライエタリの NVIDIA カーネルモジュール
    • CUDA "driver" と "runtime" ライブラリ
  • 任意:
    • 追加ライブラリ: CUBLAS, CUFFT, CUSPARSE など。
    • CUDA ツールキット。nvcc コンパイラが含まれています。
    • CUDA SDK。CUDA と OpenCL のプログラムの多数のサンプルやコードが含まれています。

カーネルモジュールと CUDA の "driver" ライブラリは nvidiaopencl-nvidia に入っています。"runtime" ライブラリと CUDA ツールキットは cuda パッケージでインストール可能です。cuda-gdb を使うには ncurses5-compat-libsAUR のインストールが必要です。FS#46598 を参照。

開発

cuda パッケージは全てのコンポーネントを /opt/cuda ディレクトリにインストールします。CUDA のコードをコンパイルするときはコンパイラのインクルードパスに /opt/cuda/include を追加してください。例えばコンパイラのフラグやオプションに -I/opt/cuda/include を加えることで追加できます。NVIDIA による gcc ラッパーである nvcc を使うには、/opt/cuda/bin をパスに追加してください。

/opt/cuda/samples にインストールされたサンプルをコンパイルしてコンパイルされたサンプルを実行することで、インストールが成功したこと、CUDA が動作していることを確認できます (サンプルディレクトリで make を実行するだけでコンパイルできます、ただし、コンパイルする前に /opt/cuda/samples ディレクトリをホームディレクトリにコピーしておいた方が良いでしょう)。インストールが問題ないことを確認するときは deviceQuery と呼ばれるサンプルのどれかを実行するのがふさわしいと思われます。

言語バインディング

GPGPU のアクセラレーションがあるソフトウェア

  • Bitcoin
  • Blender - Nvidia GPU 向けの CUDA のサポートと AMD GPU 向けの OpenCL のサポート。詳細はこちら
  • BOINC
  • DaVinci Resolve - ノンリニア動画エディタ。OpenCL と CUDA の両方を使います。
  • FFmpeg – 詳しくは こちら を参照。
  • GIMP (実験段階 - [1] を参照)
  • HandBrake
  • Hashcat
  • LibreOffice Calc – こちら を参照。
  • clinfo – システムの OpenCL プラットフォーム・デバイスのプロパティを確認。
  • cuda_memtestAUR - GPU memtest。名前とは裏腹に、CUDA と OpenCL の両方をサポートしています。
  • darktable - OpenCL 機能を使うには GPU に最低でも 1GB のメモリが搭載されていて Image support が必要です (clinfo コマンドの出力で確認できます)。
  • imagemagick
  • lc0AUR - ニューラルネットワークの検索に使います (tensorflow, OpenCL, CUDA, openblas に対応)。
  • opencv
  • pyrit
  • tensorflow-cuda および tensorflow-opt-cuda - TensorFlow の CUDA 移植
  • tensorflow-computecppAUR - TensorFlow の SYCL 移植

参照