OpenCL(オープンシーエル)とは
OpenCL(Open Computing Language)は、
マルチコアCPU、GPU、Cellプロセッサ、DSPなど、異なる種類の
計算資源を組み合わせた異種混在環境(ヘテロジニアス環境)での並列コンピューティングを可能にするための、
クロスプラットフォームなAPIです。主に科学技術計算や画像処理などの
高性能計算アプリケーションの高速化(ハードウェアアクセラレーション)に利用され、シミュレーションの可視化に用いられるリアルタイム3DグラフィックスAPIとの連携も可能です。
スーパー
コンピュータから
携帯機器まで幅広いデバイスでの利用が想定されており、
組み込みシステム向けには必要条件を緩和したOpenCL Embedded Profileも存在します。
OpenCLの仕様
OpenCLの仕様は、
Appleによって提案された後、標準化団体である
クロノス・グループのOpenCLワーキンググループによって策定されています。仕様はロイヤリティフリーな
オープン標準として公開されており、仕様に基づいたフレームワークの
実装は
サードパーティーによって行われます。ただし、
実装されたフレームワークに対して商標
ライセンスが許諾されるための仕様一致性テストには、名目上の手数料が必要です。
OpenCLの特徴
OpenCLには、以下のような特徴があります。
多様な計算資源のサポート: CPU、GPU、Cell/FPGA/Xeon Phiなど、様々な計算リソースをサポートしています。
プログラミング言語: C言語(ISO C99規格)ベースのOpenCL C、または
C++言語(ISO
C++14規格)ベースのOpenCL
C++でカーネルを記述します。
ベクトル演算のサポート: 組み込みのベクトル型やベクトル演算、Swizzle演算などが利用可能です。
オンラインコンパイラ: オンラインでOpenCL Cのコンパイルが可能です。
中間表現: SPIRおよびSPIR-Vの中間表現をサポートし、異なるハードウェア間での互換性を高めます。
並列プログラミングモデル: データ並列およびタスク並列のプログラミングモデルをサポートしています。
共有メモリモデル: 緩和型一貫性共有メモリモデルを提供し、同期ポイント以外での内容の一貫性は保証しません。OpenCL 2.0では、同期ポイントおよびアトミック操作でホスト・デバイス間のメモリ一貫性を保証する共有仮想メモリ(SVM)が導入されました。
浮動小数点数: IEEE 754に準拠した単精度
浮動小数点数(float型)演算をサポートします。
半精度[[浮動小数点数]](half型)は、ポインタ渡しや変換関数経由でのアクセスに限定されます。倍精度
浮動小数点数(double型)は拡張機能として任意サポートです。
イメージオブジェクト: 1次元/2次元/3次元のイメージオブジェクトをサポートします。
グラフィックスAPI連携: OpenGL、OpenGL ES、EGL、Direct3D 10/11との連携が可能です。
グラフィックスAPIとの関連性
OpenCLは、OpenGLやDirect3Dといった3DグラフィックスAPIとの相互運用性が確保されています。特にDirect3D APIとの連携は、クロノスが管理するOpenCL APIの拡張機能でサポートされています。ただし、Direct3D 9との連携はベンダーごとの拡張機能に依存します。
OpenCLにおける半精度および倍精度
浮動小数点数のサポート状況は、ハードウェアデバイスによって異なります。GPUが得意とする演算精度は通常単精度であり、倍精度や半精度はオプション扱いとなります。
OpenCLのイメージオブジェクトをサポートするデバイスでは、バイリニアフィルタリングなどのハードウェア機能を利用できます。
プラットフォームとデバイス
OpenCLの実行環境は、
オペレーティングシステム上のICD(Installable Client Driver)ローダーを通じて、複数のベンダーのOpenCL
実装を混在させることができます。各ベンダーのOpenCL
実装は「プラットフォーム」として抽象化され、OpenCL APIを通じて選択可能です。
OpenCLは、カーネルコードの実行ハードウェアを「デバイス」として抽象化します。各OpenCLプラットフォームは複数のOpenCLデバイスを持つことができ、OpenCL APIを通じて選択できます。
OpenCLのプログラミングモデル
OpenCLのプログラムは、OpenGLプログラムとほぼ同様に、OpenCL C/
C++で記述されたデバイスコード(カーネルコード)と、OpenCL APIを利用したホストコードに分かれています。カーネルコードのコンパイルはデバイスドライバが実行します。専用のオフライン
コンパイラを必要としないため、様々なプラットフォームへの展開が容易です。
ただし、初回実行時のカーネルコードのオンラインコンパイルには時間がかかるというデメリットがあります。実運用では、コンパイル済みバイナリからプログラムオブジェクトを生成する方法が用いられることがあります。
OpenCL 1.2以降では、SPIRおよびSPIR-Vといった中間表現をサポートすることで、事前コンパイルされたベンダーに依存しないカーネルコードを実行できます。ただし、SPIRは拡張機能であり、SPIR-VはOpenCL 2.1以降のコア機能となっています。
OpenCLの歴史
OpenCLは、
2008年に
Appleによって提案され、
クロノス・グループによって標準化が進められました。初期のバージョンから、多くの企業や団体が開発に参加し、その仕様は進化を続けています。
2008年: OpenCLの仕様草案がAppleから提案されました。
2008年12月: OpenCL 1.0の仕様が正式に発表されました。
2010年: OpenCL 1.1が発表され、float3型の追加などが行われました。
2011年: OpenCL 1.2が発表され、分割コンパイルやSubDeviceなどの機能が追加されました。
2013年: OpenCL 2.0が発表され、共有仮想メモリや動的並列処理がサポートされました。
2015年: OpenCL 2.1が発表され、SPIR-V
中間言語との共通化が進められました。
2017年: OpenCL 2.2が発表され、OpenCL C++言語やSYCL 2.2フレームワークが導入されました。
2018年: AppleはmacOSでのOpenCLの非推奨化を発表しました。
2020年: OpenCL 3.0の仕様が公開されました。
SYCLについて
SYCLは、クロノス・グループが策定した、C++を使ってヘテロジニアスプロセッサ向けのコードを記述するための抽象化レイヤーです。OpenCL APIを使ったカーネルのコンパイルやロードをホストコード側で記述する必要がなく、単一のソースコード内で記述できます。SYCLは、CUDA C++やC++ AMPに似たコンセプトを持っています。
SYCLの実装としては、Intel oneAPI DPC++ Compiler、hipSYCL、ComputeCppなどがあります。SYCL 2020以降は、OpenCLを介さないバックエンドも考慮されるようになりました。
OpenCLの関連技術
OpenCLに関連する技術として、以下のようなものがあります。
SASS: NVIDIA GPU向けの低級アセンブリ言語。
PTX: NVIDIA GPU向けのハードウェア非依存な擬似アセンブリ言語。
AMD IL: AMD GPU向けのハードウェア非依存な擬似アセンブリ言語。
AMD ISA: AMD GPU向けの低級アセンブリ言語。
Intel GEN Assembly: Intel内蔵GPU向けのアセンブリ。
TGSI: オープンソースなハードウェア非依存の中間言語。
SPIR: OpenCL向けに開発された
中間言語。
HSAIL: ヘテロジニアスシステムアーキテクチャ(HSA)向けのハードウェア非依存な中間言語。
OpenCLの開発環境
OpenCLを使用したクライアントプログラムを開発するためのSDKは、各ハードウェアベンダーから提供されています。
NVIDIA CUDA Toolkit: Windows, Linux, macOSに対応。
AMD APP SDK: Windows, Linuxに対応。
Intel SDK for OpenCL Applications: Windows, Linuxに対応。
Qualcomm Adreno SDK: Snapdragon向け。
ARM Mali OpenCL SDK: ARM Mali採用SoC向け。
Imagination PowerVR SDK: PowerVR向け。
IBM OpenCL SDK: PowerPC上のLinux向け。
OpenCL for macOS: macOSの標準機能として提供。
Intel FPGA SDK for OpenCL: FPGA上で動作するOpenCLプログラムを開発可能。
Xilinx Vitis: FPGA上で動作するOpenCLプログラムを開発可能。
LLVM/Clang: OpenCL C 2.0までのカーネルソースコードのコンパイルに対応。
clspv (Google): OpenCL CのサブセットをVulkanのコンピュートシェーダーとして実行可能。
ANGLE (Google): 各種バックエンドによるOpenGL ES互換
実装を提供し、Vulkanバックエンドとclspvを利用したOpenCLの
実装も進行中。
OpenCLOn12 (Microsoft): Direct3D 12上に実装されたOpenCL 1.2 APIの互換レイヤー。
Mesa: OpenCLのオープンソース
実装を提供。
OpenCLのプロファイラー
OpenCLプログラムの
デバッグや
チューニングには、プロファイラーが有効です。
Intel VTune Amplifier: マルチコアCPU対応のプロファイラー。
AMD CodeXL: CPU/GPUのデバッギング/プロファイリングツール。
Radeon GPU Profiler: AMD Radeon GPU用のプロファイラー。
NVIDIA Nsight: OpenCLのほか、
CUDA、Direct3D、OpenGLに対応。
OpenCLのシミュレータ/エミュレータ
OpenCLのシミュレータや
エミュレータも存在します。
GPGPU-Sim: GPUのサイクルレベルシミュレータ。
AMD OpenCL Emulator-Debugger (ocl-emu): AMDによるOpenCLソフトウェア
エミュレータ。
OpenCLのラッパー
OpenCL APIはC/
C++向けですが、各種言語用のラッパーライブラリが開発されています。
C++: Bolt C++ Template Library, Boost.Compute, VexCLなど。
C#: Cloo, OpenTKなど。
D言語: cl4d。
ECMAScript (JavaScript): WebCL, node-webclなど。
Java: Aparapi, JogAmp, LWJGLなど。
LISP系: Harlan。
Python: PyOpenCL。
Ruby: Ruby-OpenCL。
OpenCLのベンチマーク
OpenCLの性能を評価するためのベンチマークも存在します。
LuxMark: レンダリングベンチマーク。
x264 OpenCL: Phoronix Test Suiteに含まれるベンチマーク。
CompuBench CL: 総合的なベンチマーク。
Rodinia Benchmark Suite: 多種のベンチマーク。
OpenDwarfs, Parboil Benchmarks, PolyBench/GPU, SHOC benchmark suite: その他のベンチマーク。
OpenCLの採用事例
画像処理/映像処理、3DCGの物理演算およびレンダリングにおいて、OpenCLまたはCUDAによるGPGPU対応が進んでいます。
Adobe Premiere Pro CS6, Adobe Photoshop CC: 動画編集および画像編集ソフトウェア。
Blender, LuxRender, V-Ray: 3DCGソフトウェア。
OpenCV: コンピュータビジョンライブラリ。
アルテラ オプティカルフロー: 車載FPGAを利用した物体検知システム。
OpenSubdiv: オープンソースのサブディビジョンサーフェスライブラリ。
ImageMagick, FFmpeg, x264: 画像および動画処理ソフトウェア。
Bullet 3.x: 物理エンジン。
Tesseract: OCRエンジン。
macOSでの非推奨化
Appleは、macOS Mojave以降でOpenGL/OpenCLを非推奨とし、Metal APIを代替として推奨しています。iOSではOpenCLはサポートされていません。Metalを用いることで、macOS同様にGPGPUを実行することが可能です。
まとめ
OpenCLは、多様なデバイス上で並列計算を可能にする強力なAPIです。その柔軟性と性能は、様々な分野での応用を可能にしていますが、よりモダンなAPIとしてMetalに移行する動きもあります。OpenCLは、異種混在環境での高性能計算において重要な役割を果たし続けています。
関連項目
OpenCLアプリケーションの一覧
ストリーム・プロセッシング
並列コンピューティング
高性能計算
GPGPU
WebCL
CUDA, DirectCompute,
C++ AMP, OpenGL, Vulkan, Metal
RenderScript, OpenMP, OpenACC
ヘテロジニアス・コンピューティング
Cell Broadband Engine, Xeon Phi
OsiriX
外部リンク
Khronos Group
OpenCL - The open standard for parallel programming of heterogeneous systems
Khronos OpenCL Registry
Khronos SPIR Registry
*
Khronos SPIR-V Registry