OpenCL

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page OpenCL and the translation is 100% complete.
Other languages:
これと混同しないでください: OpenCT.


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

概要

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

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

  • 標準化された API ヘッダ (例えば、C や C++ 向けの #include CL/cl.h)。
  • OpenCL ライブラリ (例えば、libOpenCL.so)。

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

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

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

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

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

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

Linux における実装

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

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

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

ICD

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

Mesa (rusticl)

2023 年後半現在、opencl USE フラグ付きで media-libs/mesa をインストールすると、radeonsi で機能する rusticl とともに OpenCL 3 のインストールが提供されます。これを使用するためには、OpenCL を使用するアプリケーションを実行する前に、環境変数 RUSTICL_ENABLE=radeonsi を export しなくてはなりません (例: RUSTICL_ENABLE=radeonsi clinfo)。

Mesa (clover)

2023 年中頃の現在、media-libs/mesaopencl USE フラグとともにインストールすると、Evergreen から Sea Islands までの AMD GPU ファミリで動作する OpenCL 1.1 が提供されます (Navi など、Vega 以降の GPU ファミリはサポートされていません)。より新しい GPU については下の AMD の節を参照してください。機能の一覧は、GalliumCompute Matrix を参照してください。

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

Intel - CPU

Intel CPU の SDK は portage にある dev-util/intel-ocl-sdk で提供されています。

Intel - GPU

Intel Graphics Compute Runtime

Broadwell 世代のプロセッサからは、OpenCL 向けの Intel Graphics Compute Runtime が dev-libs/intel-compute-runtime で提供されています。

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

root #emerge --ask dev-libs/intel-compute-runtime

AMD

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

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

カーネル
Memory Management options  --->
    [*] Allow for memory hot-add
    [*]   Allow for memory hot remove
    [*] Device memory (pmem, HMM, etc...) hotplug support

Device Drivers  --->
    Graphics support  --->
        <M/*> AMD GPU
        [*]   Always enable userptr write support
        <M/*> HSA kernel driver for AMD GPU devices

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

重要
クローズドソースの OpenCL ライブラリとオープンソースドライバを混在させることは、公式には一切サポートされていません。しかしながら、ある程度成功した例があるようです[1][2]。問題に遭遇したユーザーは、フォーラムに助けを求めるようにし、バグとして報告しないことが推奨されます。

nVidia

ドライバはメイン ebuild リポジトリにある dev-util/nvidia-cuda-toolkit で提供されています。

使用上の注意

OpenCL についての情報を表示する

dev-util/clinfo パッケージを使うと、システムの OpenCL 機能についての情報を表示できます。

実装の検証

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

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

実装のチューニング

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

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

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

LLVM DLL 地獄

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

参照

  1. AMDGPU and OpenCL - Reddit
  2. Post 8087132 - Gentoo Forums