「GPGPU」の版間の差分
細 |
細 (tensorflow-opt-cuda パッケージ追加→GPGPU のアクセラレーションがあるソフトウェア) |
||
(3人の利用者による、間の23版が非表示) | |||
3行目: | 3行目: | ||
[[en:GPGPU]] |
[[en:GPGPU]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
− | {{ |
+ | {{Related|AMD Catalyst}} |
− | {{ |
+ | {{Related|NVIDIA}} |
+ | {{Related|ハードウェアビデオアクセラレーション}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
GPGPU は [[Wikipedia:ja:GPGPU|General-purpose computing on graphics processing units]] の略で GPU による汎目的計算を意味します。Linux では、現在2つの GPGPU フレームワークが存在します: [[Wikipedia:ja:OpenCL|OpenCL]] と [[Wikipedia:ja:CUDA|CUDA]]。 |
GPGPU は [[Wikipedia:ja:GPGPU|General-purpose computing on graphics processing units]] の略で GPU による汎目的計算を意味します。Linux では、現在2つの GPGPU フレームワークが存在します: [[Wikipedia:ja:OpenCL|OpenCL]] と [[Wikipedia:ja:CUDA|CUDA]]。 |
||
==OpenCL== |
==OpenCL== |
||
+ | |||
− | ===概要=== |
||
OpenCL (Open Computing Language) は非営利団体である Khronos グループによって開発されている、オープンでロイヤルティフリーの並列プログラミングフレームワークです。 |
OpenCL (Open Computing Language) は非営利団体である Khronos グループによって開発されている、オープンでロイヤルティフリーの並列プログラミングフレームワークです。 |
||
+ | OpenCL の仕様書には一般環境として必要なプログラミング言語と、プログラマーがこの環境で呼び出せる C API が書かれています。 |
||
− | 一般的に OpenCL フレームワークは以下から構成されます: |
||
− | * OpenCL API を提供するライブラリ。libCL や libOpenCL とも (Linux においては {{ic|libOpenCL.so}}) |
||
− | * OpenCL の実装、以下を含む: |
||
− | ** デバイスドライバー |
||
− | ** OpenCL/C コードコンパイラ |
||
− | ** SDK * |
||
− | * ヘッダーファイル * |
||
− | ''* が付いているものは開発のために必要'' |
||
+ | {{Tip|{{pkg|clinfo}} ユーティリティを使うことで OpenCL プラットフォームと存在するデバイス、ICD ローダーのプロパティを確認できます。}} |
||
− | ===OpenCL ライブラリ=== |
||
− | libCL には複数の選択肢が存在します。一般的には、[[公式リポジトリ]]から {{Pkg|libcl}} をインストールします。 |
||
+ | ===OpenCL ランタイム=== |
||
− | しかしながら、他の libCL が適切な場合も考えられます。これについては以下のパラグラフで詳しく説明しています。 |
||
+ | OpenCL を使用するプログラムを実行するには、ハードウェアに対応したランタイムをインストールする必要があります。 |
||
+ | ====AMD/ATI==== |
||
− | ===OpenCL の ICD モデル=== |
||
+ | * {{Pkg|opencl-mesa}}: [[AMDGPU]] と [[Radeon]] 用のフリーなランタイム。 |
||
− | OpenCL ではベンダー固有の実装を同じマシンに同時に複数インストールすることが可能になっています。実際には、Installable Client Driver (ICD) モデルを使って実装されています。このモデルの中心になっているのは ICD ローダーを実装する libCL ライブラリです。ICD ローダーを通して、OpenCL アプリケーションはシステム上に存在する全てのプラットフォーム・全てのデバイスにアクセスすることができます。 |
||
+ | * {{AUR|opencl-amd}}: [[AMDGPU]] 用のプロプライエタリなスタンドアロンのランタイム。 |
||
+ | * {{AUR|rocm-opencl-runtime}}: AMD の完全なオープンソースの ROCm GPU 計算スタックに含まれます。GFX8 以降のカードに対応 (Fiji, Polaris, Vega)。 |
||
+ | * {{AUR|opencl-amdgpu-pro-orca}}: [[AMDGPU PRO]] 用のプロプライエタリなランタイム (Vega 10 よりも古い製品をサポート)。 |
||
+ | * {{AUR|opencl-amdgpu-pro-pal}}: [[AMDGPU PRO]] 用のプロプライエタリなランタイム (Vega 10 以降の新しい製品をサポート)。 |
||
+ | * {{AUR|opencl-catalyst}}: AMD のプロプライエタリなランタイム。[[AMDGPU]] に取って代わられる予定です。 |
||
+ | * {{AUR|amdapp-sdk}}: AMD CPU ランタイム。 |
||
+ | ====NVIDIA==== |
||
− | ベンダーに依存されないと言えど、ICD ローダーを提供するライブラリが必要なのは変わりません。Arch Linux では、今のところ2つの選択肢が用意されています: |
||
+ | * {{Pkg|opencl-nvidia}}: 公式 [[NVIDIA]] ランタイム。 |
||
− | * NVIDIA の {{Pkg|libcl}}。OpenCL バージョン 1.0 を提供し、やや旧式です (最新版でも変わりません)。これまでのところ OpenCL 1.1 のコードにおける挙動はテストされていません。 |
||
− | * AMD の {{AUR|libopencl}}。OpenCL のバージョン 1.1 までを提供します。目下 AMD によって制限的なライセンスで配布されているため、公式リポジトリに入れることはできません。 |
||
+ | ====Intel==== |
||
− | (Intel の libCL も存在しますが、これは別の一つのパッケージになっていません。) |
||
+ | * {{pkg|intel-compute-runtime}}: 別名 Neo OpenCL ランタイム。Gen8 (Broadwell) 以降の Intel HD Graphics GPU 用のオープンソース実装。 |
||
+ | * {{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 もサポート。 |
||
+ | |||
+ | ====その他==== |
||
+ | * {{AUR|pocl}}: LLVM ベースの OpenCL 実装。 |
||
+ | |||
+ | ===OpenCL ICD ローダー (libOpenCL.so)=== |
||
+ | |||
+ | OpenCL ICD ローダーはプラットフォームに依存しないライブラリで、OpenCL API 経由で特定のデバイスのドライバーをロードするのに使われます。ほとんどの OpenCL ベンダーはそれぞれ独自の OpenCL ICD ローダーを提供しており、他のベンダーの OpenCL 実装でも問題なく動作するはずです。残念ながら、大抵のベンダーは最新の ICD ローダーを提供していません。そのため、Arch Linux ではこのライブラリを別のプロジェクトから用意することで ({{Pkg|ocl-icd}}) 最新の OpenCL API の実装が機能するようにしています。 |
||
+ | |||
+ | 他の ICD ローダーライブラリは各メーカーの SDK の一部としてインストールされます。確実に {{Pkg|ocl-icd}} パッケージに含まれている ICD ローダーを使用したい場合、{{ic|/etc/ld.so.conf.d}} にファイルを作成して {{ic|/usr/lib}} を動的プログラムローダーの検索ディレクトリに追加します: |
||
+ | |||
+ | {{hc|/etc/ld.so.conf.d/00-usrlib.conf|2=<nowiki> |
||
+ | /usr/lib</nowiki>}} |
||
+ | |||
+ | 全ての SDK は {{ic|ld.so.conf.d}} ファイルでランタイムのライブラリディレクトリを検索パスに追加するため上記の設定をする必要があります。 |
||
+ | |||
+ | 様々な OpenCL ICD が含まれているパッケージ: |
||
+ | * {{Pkg|ocl-icd}}: 推奨、基本的に最新です。 |
||
+ | * AMD による {{AUR|libopencl}}: OpenCL のバージョン 2.0 を提供します。目下 AMD によって制限的なライセンスで配布されているため、公式リポジトリに入れることはできません。 |
||
+ | * Intel による {{AUR|intel-opencl}}: OpenCL 2.0 を提供します。{{pkg|intel-compute-runtime}} によって廃止予定。 |
||
+ | |||
+ | {{Note|ICD ローダーのベンダーの名前が出るのはローダーを識別する必要があるときだけです。他の場合、ベンダーの名前は関係ありません。ICD ローダーはベンダーに依存しないため (正しく実装されてさえいれば) 相互に交換して使うことができます。}} |
||
+ | ===OpenCL 開発=== |
||
− | {{Note|ICD Loader's vendor is mentioned only to identify each loader, it is otherwise completely irrelevant. ICD Loaders are vendor-agnostic and may be used interchangeably (as long as they are implemented correctly).}} |
||
+ | OpenCL を使用して開発をしたい場合、最低でも以下のパッケージが必要になります: |
||
+ | * {{Pkg|ocl-icd}}: OpenCL ICD ローダーの実装、最新の OpenCL の仕様に沿っています。 |
||
+ | * {{Pkg|opencl-headers}}: OpenCL C/C++ API ヘッダー。 |
||
+ | ベンダーの SDK には様々なツールやサポートライブラリが含まれています: |
||
− | 基本的な使用においては、インストールとアップデートが簡単なことから ''libcl'' を推奨します。高度な使用をする場合は、''libopencl'' が推奨されます。多少の違いがあっても ''libcl'' と ''libopencl'' はどちらも全ての実装で動作するはずです。 |
||
+ | * {{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}} パッケージに入っています。 |
||
+ | * {{Pkg|cuda}}: NVidia の GPU SDK、OpenCL 1.1 のサポートを含んでいます。 |
||
===実装=== |
===実装=== |
||
43行目: | 73行目: | ||
$ ls /etc/OpenCL/vendors |
$ ls /etc/OpenCL/vendors |
||
+ | OpenCL プラットフォームとデバイスの利用可能な (既知の) プロパティを確認するには {{pkg|clinfo}} を[[インストール]]してください。 |
||
− | ====AMD==== |
||
− | AMD の OpenCL 実装は [http://developer.amd.com/sdks/AMDAPPSDK/Pages/default.aspx AMD APP SDK] として知られています。以前は AMD Stream SDK または ATi Stream とも呼ばれていました。 |
||
+ | ====言語バインディング==== |
||
− | Arch Linux では、現在 AMD APP SDK は AUR の {{AUR|amdapp-sdk}} としてインストールすることができます。このパッケージは {{ic|/opt/AMDAPP}} にインストールされ、SDK ファイルとは別に、多数のサンプルコードも含まれています ({{ic|/opt/AMDAPP/SDK/samples/}})。システム上の OpenCL プラットフォームやデバイスをリストアップして、それぞれの詳しい情報を表示する {{ic|clinfo}} ユーティリティも入っています。 |
||
+ | * C++: Khronos によるバインディングが公式の仕様書 (バージョン 1.2) に存在します。{{Pkg|opencl-headers}} に含まれています。 |
||
+ | * 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] |
||
+ | * [[Python]]: PyOpenCL という同じ名前を持った2つのバインディングが存在します。片方は [extra] に入っています: {{pkg|python-pyopencl}}。もう片方については [https://sourceforge.net/projects/pyopencl/ sourceforge] を見て下さい。 |
||
+ | * [[D]]: [https://bitbucket.org/trass3r/cl4d/wiki/Home cl4d] |
||
+ | * [[Java]]: [http://jogamp.org/jocl/www/ JOCL] ([http://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: raco でインストールすることができるネイティブインターフェイスが [http://planet.racket-lang.org/display.ss?owner=jaymccarthy&package=opencl.plt PLaneT] にあります。 |
||
+ | * [[Rust]]: [https://github.com/cogciprocate/ocl ocl] |
||
+ | * [[Julia]]: [https://github.com/JuliaGPU/OpenCL.jl OpenCL.jl] |
||
+ | ==SYCL== |
||
− | AMD APP SDK 自体にも CPU の OpenCL ドライバーが含まれているため、(ベンダーの如何を問わず) CPU デバイスで OpenCL を実行するのに追加のドライバーは必要ありません。GPU の OpenCL ドライバーは (任意の依存パッケージである) {{AUR|catalyst}} パッケージに入っています。オープンソースドライバー ({{Pkg|xf86-video-ati}}) は OpenCL を''サポートしていません''。 |
||
+ | [[Wikipedia:SYCL|SYCL]] は Khronos Group によって作られたオープン・ロイヤルティフリーな標準で、OpenCL 1.2 に基づく C++ によるシングルソースのヘテロジニアスプログラミングモデルを定義しています。 |
||
+ | SYCL はランタイム部分と C++ デバイスコンパイラから構成されます。デバイスコンパイラはあらゆる種類のアクセラレータを対象とします。ランタイムは OpenCL 実装が存在しない場合に CPU コードパスにフォールバックするために必要となります。 |
||
− | コードは (依存パッケージになっている) {{Pkg|llvm}} を使ってコンパイルされます。 |
||
− | === |
+ | ===実装=== |
+ | * {{AUR|computecpp}}: Codeplay による SYCL 1.2.1 のプロプライエタリ実装。SPIR, SPIR-V を対象とし、実験的なデバイスターゲットとして PTX (NVIDIA) にも対応。 |
||
− | Mesa の OpenCL サポートは開発中です (http://www.x.org/wiki/GalliumStatus/ を参照)。AMD Radeon カードは r600g ドライバーによってサポートされています。 |
||
+ | * {{AUR|trisycl-git}}: Xilinx によって開発されているオープンソースの実装。 |
||
+ | * {{AUR|hipsycl-cuda-git}} と {{AUR|hipsycl-rocm-git}}: OpenCL の代わりに AMD の HIP を使用するフリー実装。AMD と NVIDIA の GPU で動作可能。 |
||
+ | ===SPIR サポートの確認=== |
||
− | Arch Linux は現在 (2014年4月; Mesa 10.1.0; LLVM 3.4)、OpenCL サポートを有効にして Mesa をビルドしていません。http://dri.freedesktop.org/wiki/GalliumCompute/ のインストール手順を見て下さい (最良の結果を得るには LLVM と Mesa の開発ブランチを使います)。 |
||
+ | 大抵の 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= |
||
− | [http://pkgbuild.com/~lcarlier/mesa-git/ lordheavy のリポジトリ] を使うこともできます。以下のパッケージをインストールしてください: |
||
+ | 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 |
||
− | * {{AUR|mesa-dri-git}} |
||
+ | IL version SPIR-V_1.0 |
||
− | * {{AUR|opencl-mesa-git}} |
||
+ | SPIR versions 1.2 |
||
− | * {{AUR|libclc-git}} |
||
+ | }} |
||
+ | ComputeCpp にはシステム情報を表示するツールが付属しています: |
||
− | 驚くべきことに、radeon+r600g を使った場合 Catalyst 13.11 Beta1 と比べて 20% 高速に pyrit が動作します (他の7つの CPU コアでもテスト): |
||
+ | {{hc|$ computecpp_info| |
||
− | {{bc|<nowiki>catalyst #1: 'OpenCL-Device 'Barts'': 21840.7 PMKs/s (RTT 2.8) |
||
+ | Device 0: |
||
− | radeon+r600g #1: 'OpenCL-Device 'AMD BARTS'': 26608.1 PMKs/s (RTT 3.0)</nowiki>}} |
||
− | 執筆時点では (2013年10月30日)、このパフォーマンスを得るためには [http://people.freedesktop.org/~tstellar/pyrit-perf/0001-XXX-clover-Calculate-the-optimal-work-group-size.patch] と [http://people.freedesktop.org/~tstellar/pyrit-perf/0001-radeon-llvm-Specify-the-DataLayout-when-running-opti.patch] のパッチを Mesa のコミット ac81b6f2be8779022e8641984b09118b57263128 上にあてる必要があります。パッチがあたってない最新の LLVM トランクを使用しました (SVN rev 193660)。 |
||
+ | Device is supported : UNTESTED - Untested OS |
||
− | ====NVIDIA==== |
||
+ | CL_DEVICE_NAME : Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz |
||
− | NVIDIA の実装は[[公式リポジトリ]]の {{Pkg|opencl-nvidia}} からインストールできます。{{Pkg|nvidia}} カーネルモジュールが動作する NVIDIA GPU のみをサポートしています (nouveau はまだ OpenCL をサポートしていません)。 |
||
+ | CL_DEVICE_VENDOR : Intel(R) Corporation |
||
+ | CL_DRIVER_VERSION : 18.1.0.0920 |
||
+ | CL_DEVICE_TYPE : CL_DEVICE_TYPE_CPU |
||
+ | }} |
||
− | ====Intel==== |
||
− | Intel の実装は、シンプルに [http://software.intel.com/en-us/articles/opencl-sdk/ Intel OpenCL SDK] という名前が付けられており、Intel の CPU (主に Core と Xeon) と GPU だけに最適化された OpenCL パフォーマンスを発揮します。パッケージは [[AUR|AUR]] からインストールできます: {{AUR|intel-opencl-sdk}}。ランタイムは別のパッケージとして [[AUR|AUR]] にあります: {{AUR|intel-opencl-runtime}}。Ivy Bridge 以降の新しいハードウェアに搭載されている統合グラフィックハードウェアのための OpenCL は AUR の {{AUR|beignet}} から入手できます。 |
||
+ | SPIR や SPIR-V をサポートしている既知のドライバーとして {{pkg|intel-compute-runtime}}, {{AUR|intel-opencl-runtime}}, {{AUR|pocl}}, {{AUR|amdgpu-pro-opencl}}{{Broken package link|パッケージが存在しません}} などが存在します。 |
||
− | ===開発=== |
||
− | OpenCL を利用するアプリケーションを開発するには、実装とドライバー、コンパイラを含む OpenCL フレームワークに加えて {{Pkg|opencl-headers}} パッケージをインストールする必要があります。あなたのコードを {{ic|libOpenCL}} にリンクしてください。 |
||
+ | ===SYCL 開発=== |
||
− | ====言語バインディング==== |
||
+ | SYCL を使うには C++11 環境が必要です。少数ながらオープンソースのライブラリが存在します: |
||
− | * C++: Khronos によるバインディングが公式の仕様書に存在します。{{Pkg|opencl-headers}} に含まれています。 |
||
+ | * [https://github.com/codeplaysoftware/computecpp-sdk/ ComputeCpp SDK]: コードサンプル集や ComputeCpp の{{Pkg|cmake}} 統合 |
||
− | * C++/Qt: Qt Labs に [http://qt.gitorious.org/qt-labs/opencl QtOpenCL] という名前の実験的なバインディングがあります - 詳しくは [http://labs.qt.nokia.com/2010/04/07/using-opencl-with-qt/ ブログエントリ] を参照 |
||
+ | * [https://github.com/codeplaysoftware/SYCL-DNN SYCL-DNN]: ニューラルネットワークパフォーマンスプリミティブ |
||
− | * JavaScript/HTML5: [http://www.khronos.org/webcl/ WebCL] |
||
+ | * [https://github.com/codeplaysoftware/SYCL-BLAS SYCL-BLAS]: 線形代数パフォーマンスプリミティブ |
||
− | * [[Python|Python]]: PyOpenCL という同じ名前を持った2つのバインディングが存在します。片方は [extra] に入っています: {{Pkg|python2-pyopencl}}。もう片方については [http://sourceforge.net/projects/pyopencl/ sourceforge] を見て下さい。 |
||
+ | * [https://github.com/codeplaysoftware/visioncpp VisionCpp]: コンピュータビジョンライブラリ |
||
− | * [[D]]: [https://bitbucket.org/trass3r/cl4d/wiki/Home cl4d] |
||
+ | * [https://github.com/KhronosGroup/SyclParallelSTL SYCL Parallel STL]: C++17 並列アルゴリズムの GPU 実装 |
||
− | * [[Haskell|Haskell]]: OpenCLRaw パッケージを AUR からインストールできます: {{AUR|haskell-openclraw-git}} |
||
− | * [[Java|Java]]: [http://jogamp.org/jocl/www/ JOCL] ([http://jogamp.org/ JogAmp] の一部) |
||
− | * [[Mono|Mono/.NET]]: [http://sourceforge.net/projects/opentk/ Open Toolkit] |
||
− | * [[Go|Go]]: [https://github.com/samuel/go-opencl OpenCL bindings for Go] |
||
==CUDA== |
==CUDA== |
||
− | CUDA (Compute Unified Device Architecture) は [[ |
+ | CUDA (Compute Unified Device Architecture) は [[NVIDIA]] による、プロプライエタリでクローズドソースの並列計算アーキテクチャ・フレームワークです。NVIDIA の GPU を必要とします。CUDA は複数のコンポーネントから構成されます: |
* 必須: |
* 必須: |
||
** プロプライエタリの NVIDIA カーネルモジュール |
** プロプライエタリの NVIDIA カーネルモジュール |
||
98行目: | 140行目: | ||
** CUDA SDK。CUDA と OpenCL のプログラムの多数のサンプルやコードが含まれています。 |
** CUDA SDK。CUDA と OpenCL のプログラムの多数のサンプルやコードが含まれています。 |
||
− | カーネルモジュールと CUDA の "driver" ライブラリは {{Pkg|nvidia}} と {{Pkg|opencl-nvidia}} に入っています。"runtime" ライブラリと CUDA ツールキットは {{Pkg|cuda}} パッケージでインストール可能です。 |
+ | カーネルモジュールと CUDA の "driver" ライブラリは {{Pkg|nvidia}} と {{Pkg|opencl-nvidia}} に入っています。"runtime" ライブラリと CUDA ツールキットは {{Pkg|cuda}} パッケージでインストール可能です。{{ic|cuda-gdb}} を使うには {{aur|ncurses5-compat-libs}} のインストールが必要です。{{Bug|46598}} を参照。 |
===開発=== |
===開発=== |
||
− | {{Pkg|cuda}} パッケージは全てのコンポーネントを {{ic|/opt/cuda}} ディレクトリにインストールします。CUDA のコードをコンパイルするときはコンパイラのインクルードパスに {{ic|/opt/cuda/include}} を追加してください。例えばコンパイラのフラグやオプションに {{ic|-I/opt/cuda/include}} を加えることで追加できます。 |
+ | {{Pkg|cuda}} パッケージは全てのコンポーネントを {{ic|/opt/cuda}} ディレクトリにインストールします。CUDA のコードをコンパイルするときはコンパイラのインクルードパスに {{ic|/opt/cuda/include}} を追加してください。例えばコンパイラのフラグやオプションに {{ic|-I/opt/cuda/include}} を加えることで追加できます。NVIDIA による {{ic|gcc}} ラッパーである {{ic|nvcc}} を使うには、{{ic|/opt/cuda/bin}} をパスに追加してください。 |
+ | |||
+ | {{ic|/opt/cuda/samples}} にインストールされたサンプルをコンパイルしてコンパイルされたサンプルを実行することで、インストールが成功したこと、CUDA が動作していることを確認できます (サンプルディレクトリで {{ic|make}} を実行するだけでコンパイルできます、ただし、コンパイルする前に {{ic|/opt/cuda/samples}} ディレクトリをホームディレクトリにコピーしておいた方が良いでしょう)。インストールが問題ないことを確認するときは {{ic|deviceQuery}} と呼ばれるサンプルのどれかを実行するのがふさわしいと思われます。 |
||
===言語バインディング=== |
===言語バインディング=== |
||
− | * Fortran: |
+ | * Fortran: [http://www.pgroup.com/resources/cudafortran.htm PGI CUDA Fortran Compiler] |
− | * [[ |
+ | * [[Haskell]]: [https://hackage.haskell.org/package/accelerate accelerate パッケージ] に CUDA バックエンドがあります |
− | * [[ |
+ | * [[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: [ |
+ | * [[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] |
− | * [[ |
+ | * [[Ruby]], Lua: [http://psilambda.com/products/kappa/ Kappa] |
− | |||
− | ===ドライバーの問題=== |
||
− | |||
− | 複数の GPU が載っている環境で CUDA プログラムを実行する場合、パーミッション問題を解決するためにレガシーなドライバー {{Pkg|nvidia-304xx}} または {{Pkg|nvidia-304xx-lts}} を使う必要があるかもしれません。 |
||
− | == |
+ | ==GPGPU のアクセラレーションがあるソフトウェア== |
* [[Bitcoin]] |
* [[Bitcoin]] |
||
+ | * [[Blender]] - Nvidia GPU 向けの CUDA のサポートと AMD GPU 向けの OpenCL のサポート。詳細は[http://blender.org/manual/render/cycles/features.html#features こちら]。 |
||
− | * [[GIMP|GIMP]] (実験段階 - [http://www.h-online.com/open/news/item/GIMP-2-8-RC-1-arrives-with-GPU-acceleration-1518417.html] を参照) |
||
+ | * [[BOINC]] |
||
− | * {{AUR|pyrit}} |
||
+ | * [[DaVinci Resolve]] - ノンリニア動画エディタ。OpenCL と CUDA の両方を使います。 |
||
− | * {{Pkg|aircrack-ng}} |
||
+ | * [[FFmpeg]] – 詳しくは [https://trac.ffmpeg.org/wiki/HWAccelIntro#OpenCL こちら] を参照。 |
||
− | * {{AUR|john-opencl}} |
||
+ | * [[GIMP]] (実験段階 - [http://www.h-online.com/open/news/item/GIMP-2-8-RC-1-arrives-with-GPU-acceleration-1518417.html] を参照) |
||
+ | * [[HandBrake]] |
||
+ | * [[Hashcat]] |
||
+ | * [[LibreOffice]] Calc – [https://help.libreoffice.org/Calc/OpenCL_Options こちら] を参照。 |
||
+ | * {{Pkg|clinfo}} – システムの OpenCL プラットフォーム・デバイスのプロパティを確認。 |
||
* {{AUR|cuda_memtest}} - GPU memtest。名前とは裏腹に、CUDA と 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|pyrit}} |
||
+ | * {{Pkg|tensorflow-cuda}} および {{Pkg|tensorflow-opt-cuda}} - TensorFlow の CUDA 移植 |
||
+ | * {{AUR|tensorflow-computecpp}} - TensorFlow の SYCL 移植 |
||
==参照== |
==参照== |
||
* [http://www.khronos.org/opencl/ OpenCL 公式ホームページ] |
* [http://www.khronos.org/opencl/ OpenCL 公式ホームページ] |
||
− | * [ |
+ | * [https://www.khronos.org/sycl/ SYCL 公式ホームページ] |
− | * [ |
+ | * [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.nvidia.com/cuda-toolkit-40 CUDA Toolkit ホームページ] |
||
− | * [http:// |
+ | * [http://developer.amd.com/appsdk AMD APP SDK ホームページ] |
+ | * [https://developer.nvidia.com/cuda-toolkit CUDA Toolkit ホームページ] |
||
+ | * [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 フレームワークが存在します: OpenCL と CUDA。
目次
OpenCL
OpenCL (Open Computing Language) は非営利団体である Khronos グループによって開発されている、オープンでロイヤルティフリーの並列プログラミングフレームワークです。
OpenCL の仕様書には一般環境として必要なプログラミング言語と、プログラマーがこの環境で呼び出せる C API が書かれています。
OpenCL ランタイム
OpenCL を使用するプログラムを実行するには、ハードウェアに対応したランタイムをインストールする必要があります。
AMD/ATI
- opencl-mesa: AMDGPU と Radeon 用のフリーなランタイム。
- 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
- opencl-nvidia: 公式 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 によって廃止予定。
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 をインストールしてください。
言語バインディング
- C++: Khronos によるバインディングが公式の仕様書 (バージョン 1.2) に存在します。opencl-headers に含まれています。
- C++/Qt: Qt Labs に QtOpenCL という名前の実験的なバインディングがあります - 詳しくは ブログエントリ を参照
- JavaScript/HTML5: WebCL
- Python: PyOpenCL という同じ名前を持った2つのバインディングが存在します。片方は [extra] に入っています: python-pyopencl。もう片方については sourceforge を見て下さい。
- D: cl4d
- Java: JOCL (JogAmp の一部)
- Mono/.NET: Open Toolkit
- Go: OpenCL bindings for Go
- Racket: raco でインストールすることができるネイティブインターフェイスが PLaneT にあります。
- Rust: ocl
- Julia: OpenCL.jl
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-gitAUR と hipsycl-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" ライブラリは nvidia と opencl-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
と呼ばれるサンプルのどれかを実行するのがふさわしいと思われます。
言語バインディング
- Fortran: PGI CUDA Fortran Compiler
- Haskell: accelerate パッケージ に CUDA バックエンドがあります
- Java: JCuda
- Mathematica: CUDAlink
- Mono/.NET: CUDA.NET, CUDAfy.NET
- Perl: KappaCUDA, CUDA-Minimal
- Python: python-pycuda または Kappa
- Ruby, Lua: Kappa
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 移植