OpenCL/ja

Open Computing Language (OpenCL) は、Article description::ヘテロジニアス(異種)コンピューティングプラットフォーム (CPU、GPU、DSP、FPGA、ASIC など) にわたって実行されるプログラムを作成するためのフレームワークです.

概要
この記事の要点は Gentoo における実装と独自の小技に対処することにあるので、概要は簡単に済ませます. 技術的観点からのよりよい概要については、wikipediaの OpenCL 記事を見てください.

OpenCL 自体は、単純なインターフェースを持つライブラリとして提供されています:


 * 標準化された API ヘッダ (例えば、C や C++ 向けの ).
 * OpenCL ライブラリ (例えば、).

多くの OpenCL プラットフォーム を1つのシステム上で提供するための標準が作られており、各プラットフォームは様々な デバイス を扱うことができます. 各デバイスはそれぞれ固有の計算に関する特性を持ちます (コンピュートユニットの数、最適なベクターサイズ、メモリ上限など).

OpenCL 標準によって、OpenCL カーネルを読み込み、それらをターゲットのハードウェア上で実行できるようになります. カーネルは、C99 に似た一群のコードで、OpenCL 実装(多くは LLVM に依存して動作します)によって JIT コンパイルされます. カーネルをコンパイルしたり、それらを読み込んだり、ターゲットデバイスとデータを送受信するための関数が提供されます.

ハートウェアベンダは、ハードウェアに OpenCL の基本要素を実装することでこの標準の恩恵を得られます.

OpenCL 実装をインストールするということは、OpenCL API を実装しているライブラリを追加するとともに、ライブラリパスへの参照を 内のファイルとして ICD (Installable Client Driver) データベースに追加することを意味します.

ICD ローダーは、一般ローダーまたは実装によって提供されます. OpenCL のユーザーの多くは、 を使用して、その中から1つを選択する必要があります.

OpenCL ホストとデバイスにおける API 呼び出しやメモリ階層は標準化されています. しかし、このことは、異なる実装でも動作可能であるコードが、そのすべてにおいて効率的であることを意味しません. 多くの場合、コードは、1つの実装で問題を取り除くためのテストを必要とします. implementation validation 及び implementation tuning 節を参照してください.

Linux における実装
これらは、OpenCL の実装を提供している上流プロジェクトです.


 * pocl は、オープンソースで LLVM ベースの OpenCL 実装で、必ずしも最速でないが教育的な CPU 向けです. (現在のところ Gentoo Ebuild ツリーにはありません)
 * mesa にはいくつかの GPU 上で動作する発展途上の実装があります.
 * AMD は OpenCL ライブラリを含む AMD APP SDK を提供しています.
 * NVIDIA は OpenCL ライブラリを含む CUDA toolkit を提供しています.
 * Intelは Linux 上で、CPU デバイス向けの実装と、GPU デバイス向けの実装 ("Beignet") を有しています.

実装は、今後、さらに細かい区分向けに開発されていくかもしれません.

ICD
パッケージは、異なる OpenCL 実装を有功にするための間接参照レイヤーを提供するとともに、pkg-config の OpenCL.pc ディスクリプタも提供します.

Mesa (clover)
2016年以降、 を  USE フラグとともにインストールすると、ほぼ全てのAMD GPU で動作する OpenCL 1.1 が提供されます. 機能の一覧は、GalliumCompute Matrix を参照してください.

media-libs/mesa-20.3 からは、OpenCL 1.2 がサポートされています.

Intel - CPU
Intel CPU の SDK は portage にある で提供されています.

Intel Graphics Compute Runtime
Broadwell 世代のプロセッサからは、OpenCL 向けの Intel Graphics Compute Runtime が で提供されています.

の備考が推奨しているとおり、手動でインストールしましょう (64ビットのみ):

AMD
AMD の最新の OpenCL 実装は ROCm, Radeon Open Compute で、GFX8 以降の GPU チップ (Fiji、Polaris、Vega) をサポートしています. GFX7 チップは有効化されていますが、公式にはサポートされていません. より古いチップについては、(前に説明した) Mesa clover 実装か、(これから説明する) amdgpu-pro-opencl 実装を使ってください. ROCm は Gentoo で使用できます; をインストールしてください. エラーなく動作させるために、 を  USE フラグで再コンパイルし、また  についてはデフォルトの   USE フラグをこのままにしておいてください.

ROCm を AMDGPU ドライバで正常に動作させるには、以下のカーネルオプションを設定する必要があります:

また、Ubuntu の AMDGPU-PRO ドライバパッケージ由来のクローズドソースの OpenCL ライブラリを提供する パッケージも存在します. このライブラリは、通常はクローズドソースの AMDGPU-PRO ドライバとともに使用されますが、このパッケージは、それをオープンソースの AMDGPU ドライバとともに使用できるかどうか試したいユーザーの助けになるでしょう.

nVidia
ドライバはメイン ebuild リポジトリにある で提供されています.

OpenCL についての情報を表示する
パッケージを使うと、システムの OpenCL 機能についての情報を表示できます.

実装の検証
実装 (特に実験的なもの) は、以下のようなテストスイートを実行することでチェックできます:


 * piglit: オープンソースの OpenGL/OpenCL テストスイート. シンプルな piglit テストについては GalliumCompute を参照してください.

実装のチューニング
主要なベンダーは、何らかの形で、そのハードウェアを最大限活用するための高度なドキュメントを提供しているでしょう:


 * nVidia: 開発者をターゲットにした nVidia ハードウェア向けに、nVidiaは Best Practices Guide を提供しています.
 * AMD: 開発者をターゲットにした AMD ハードウェア向けに、AMD は Optimization Guide を提供しています.

特性の中には、見つけるのが容易ではないものもあります. ベンチマークはそれらを発見するための1つの手段です.

LLVM DLL 地獄
LLVM は中心的なライブラリになりつつあり、実装のほとんどで利用されています. ユーザーや実装者が気を付けていないと、リンクに関する問題が起こることがあります (シンボルの衝突、コンストラクターが複数回呼ばれて処理されないなど). こうした事態は、多くの実装で目にすることです.