OpenCL
OpenCL(オープンシーエル、Open Computing Language)は、マルチコアCPUやGPU、Cellプロセッサ、DSPなどによる異種混在の計算資源(ヘテロジニアス環境、ヘテロジニアス・コンピューティング、Heterogeneous)を利用した並列コンピューティングのためのクロスプラットフォームなAPIである。主な用途は科学技術計算やに代表される高性能計算のためのアプリケーションソフトウェアの高速化(ハードウェアアクセラレーション)であり、シミュレーション可視化に用いるリアルタイム3次元コンピュータグラフィックスAPIとの連携も拡張機能として標準化されている。スーパーコンピュータやサーバ、ワークステーションやパーソナルコンピュータのほか、携帯機器などでの利用も想定されており、組み込みシステム向けに必要条件を下げたOpenCL Embedded Profileが存在する。
OpenCLの仕様はAppleによって提案されたのち、標準化団体クロノス・グループの作業部会OpenCL Working Group(旧Compute Working Group)によって策定されている。仕様はロイヤリティフリーなオープン標準として公開されており、仕様に基づいたフレームワークの実装はサードパーティーによって行われる。ただし、実装されたフレームワークに対して許諾される商標ライセンスに必要な仕様一致性テストには、'nominal fee'(名目上の手数料)が必要である。
OpenCLには次のような特徴がある。
CPU(CL_DEVICE_TYPE_CPU)、GPU(CL_DEVICE_TYPE_GPU)、およびCell/FPGA/Xeon Phiなど(CL_DEVICE_TYPE_ACCELERATOR)の各種計算資源のサポート
C言語(ISO C99規格)をベースにしたOpenCL C、あるいはC++言語(ISO C++14規格)をベースにしたOpenCL C++プログラミング言語によるカーネル記述
組み込みのベクトル型およびベクトル演算のサポート(float2型、float4型などや、Swizzle演算など)
オンラインのOpenCL Cコンパイラ
SPIRおよびSPIR-V中間表現のサポート (SPIR 1.2/2.0 for OpenCL 1.2/2.0, SPIR-V 1.0 for OpenCL 2.1)
同期ポイント以外での内容の一貫性 (consistency) を保証しない、緩和型一貫性共有メモリモデル (relaxed-consistency shared memory model)
同期ポイントおよびOpenCLアトミック操作でのホスト・デバイス間のメモリ一貫性を保証する共有仮想メモリ (shared virtual memory: SVM, OpenCL 2.0)
IEEE 754準拠の単精度浮動小数点数(float型)演算のサポート
ポインタ渡しおよびfloat型との相互変換関数経由でのアクセスに限定されるIEEE 754-2008準拠の半精度浮動小数点数(half型)
OpenCL 1.0においては、half型の直接演算は拡張 (cl_khr_fp16) による任意サポートに留まる
OpenCL 1.0においては、倍精度浮動小数点数(double型)は拡張 (cl_khr_fp64) による任意サポートに留まる
1次元/2次元/3次元のイメージオブジェクトのサポート(1次元イメージはOpenCL 1.2以降)
OpenGLおよびOpenGL ESのバッファ、テクスチャ、レンダーバッファとの連携(cl_gl.h、OpenCL 1.0以降の拡張)
EGL (API)のイメージ、ディスプレイ、同期オブジェクトとの連携(cl_egl.h、OpenCL 1.2以降の拡張)
Direct3D 10のバッファおよびテクスチャとの連携(; cl_d3d10.h、OpenCL 1.1以降の拡張)
Direct3D 11のバッファおよびテクスチャとの連携(; cl_d3d11.h、OpenCL 1.2以降の拡張)
DirectX 9のメディアサーフェイス連携(; cl_dx9_media_sharing.h、OpenCL 1.2以降の拡張)
OpenCL類似技術にNVIDIAのCUDA(後述)が存在するが、OpenCLにはCUDA同様に、3DグラフィックスAPIであるOpenGL(クロスプラットフォーム)およびDirect3D(Windowsプラットフォーム専用)との相互運用性(Interoperability)がAPIレベルで確保されている。
なお、OpenCLの動作ターゲットとしての用件を満たしたGPU(主にDirectX 10世代以上の統合型シェーダーアーキテクチャを採用したGPU)で使用できるDirect3D API(Direct3D 10およびDirect3D 11)との相互運用機能は、クロノスが管理しているOpenCL API公式拡張でサポートされるが、旧来のDirect3D 9との相互運用機能は、OpenCL 2.0時点でもベンダーごとの拡張機能依存となっている(cl_d3d9_ext.h)。
OpenCLでのhalf/double型のサポート状況は、CUDAなどのほかのAPIとよく似ており、サポートされるかどうかはハードウェアデバイス次第である。また、OpenGL/Direct3Dでは浮動小数点テクスチャすなわちデータストレージのフォーマットとしてFP32形式のほかにFP16形式を選択できるが、通例GPUが得意とする演算精度は単精度であるため、シェーダープログラム中で利用できる演算精度は一般的には単精度となり、倍精度や半精度はオプション扱いとなる。
OpenCLのイメージオブジェクトをサポートするデバイス (CL_DEVICE_IMAGE_SUPPORT) では、バイリニアフィルタリングなどの高速なハードウェア機能を利用することもできる。
以下にOpenGL関連の拡張を列挙する。
cl_apple_gl_sharing, cl_khr_gl_sharing: OpenCL 1.0の拡張。
cl_khr_gl_event: OpenCL 1.2の拡張。
cl_khr_egl_image, cl_khr_gl_msaa_sharing: OpenCL 2.0の拡張。
OpenCL実行環境であるオペレーティングシステム上には、Installable Client Driver (ICD) Loaderという仕組みにより、複数のベンダーによるOpenCL実装を混在させることができる(cl_khr_icd)。各ベンダーのOpenCL実装は「プラットフォーム」として抽象化され、OpenCL APIを通じて列挙・選択することができる。
またOpenCLはカーネルコードの実行ハードウェアを「デバイス」として抽象化する。各OpenCLプラットフォームは複数のOpenCLデバイスを持つことができ、OpenCL APIを通じて列挙・選択できる。
OpenCLのプログラム(アプリケーションソフトウェア)は、GLSLを利用したOpenGLプログラムとほぼ同じ要領で開発することができ、OpenCL C/C++を利用したデバイスコード(カーネルコード)と、OpenCL APIを利用したホストコードを別々に記述する。カーネルコードのコンパイルは、clCreateProgramWithSource()関数経由でデバイスドライバーが実行する。CUDAプログラムのような専用オフライン コンパイラ(nvcc)を必要としないため、様々なプラットフォームへの展開が容易となることが利点である。ただしカーネルコードの初回の実行時コンパイル(オンライン コンパイル)に時間がかかるなどのデメリットも存在する。この点に関しては、実運用時にはclCreateProgramWithSource()関数によるオンライン コンパイルは行なわず、clGetProgramInfo()関数とclCreateProgramWithBinary()関数を用いてコンパイル済みバイナリからプログラムオブジェクトを生成する方法もあるが、ベンダーごとのOpenCLバイナリ間における互換性は保証されない。デバイスドライバーにカーネル記述言語のオンラインコンパイラの役割を持たせることで、ベンダー独自の拡張を実装しやすくなるが、コンパイラ品質はデバイスドライバーの品質に左右される。
なお、OpenCL 1.2、2.0、2.1、2.2では、Standard Portable Intermediate RepresentationおよびSPIR-Vと呼ばれる中間表現(中間言語、バイトコード)をサポートすることにより、事前コンパイルしたベンダーに依存しないカーネルコードを実行することができるようになる。ただし、SPIR 1.2およびSPIR 2.0はOpenCL 1.2およびOpenCL 2.0の拡張機能(cl_khr_spir)となっており、サポート必須の機能ではない。一方、SPIR-VはOpenCL 2.1/2.2のコア機能となる。OpenCL 2.1ではSPIR-V 1.0を、OpenCL 2.2ではSPIR-V 1.0/1.1/1.2をサポートするが、OpenCL 3.0ではSPIR-Vはコア機能から外れ、サポート状況に関しては実行時の問い合わせが必要となった。
2008年6月10日(日本時間)のWorldwide Developers Conference (WWDC 2008) において、Mac OS X Snow Leopard(v10.5 Leopardの次期メジャーバージョンとされる)に搭載される予定の技術の1つとして初めて発表された。
標準化団体クロノス・グループの2008年6月16日に発足した作業部会Compute Working Group (CWG) において、AppleによってOpenCLの仕様草案が提案された。CWGはGPUとCPUのヘテロジニアス(異種混在)な計算技術のロイヤリティフリーな標準化を目的としており、発足時点では3Dlabs、AMD、アップル、ARM、Codeplay、エリクソン、フリースケール・セミコンダクタ、Graphic Remedy、IBM、イマジネーション・テクノロジーズ、インテル、ノキア、NVIDIA、モトローラ、QNX、クアルコム、サムスン、Seaweed、テキサス・インスツルメンツ、スウェーデン・ウメオ大学が参加している。
2008年8月のSIGGRAPH 2008および同年11月のSupercomputing 2008 (SC08) において、仕様策定の進捗状況が発表され、同時期にCompute Working Groupは名称をOpenCL Working Groupと改められ、新たにアクティビジョン・ブリザード、バルコ、ブロードコム、エレクトロニック・アーツ、エイチアイ、ケストレル研究所、Movidia、RapidMind、TAKUMIが参加している。11月10日にはRapidMindが自社の並列コンピューティング開発環境においてOpenCLを採用すると発表した。
2008年12月9日のSIGGRAPH Asia 2008において、正式版となるOpenCL 1.0の仕様が発表された。またほぼ同時期に、AMDとNVIDIAはそれぞれ自社のGPGPU技術であるATI StreamおよびCUDAにおいてOpenCL 1.0をサポートすると発表した。OpenCL 1.0対応の最初のプラットフォームとして、Mac OS X Snow Leopardが2009年8月28日にリリースされた。
2010年6月14日、OpenCL 1.1を正式発表。float3型の追加、clSetKernelArg()関数以外のスレッドセーフ化など。
2011年11月15日、OpenCL 1.2を正式発表。分割コンパイル&リンク対応、SubDeviceの追加、SPIR 1.2拡張機能、3Dイメージの書き込み拡張機能など。
2013年7月22日、OpenCL 2.0を正式発表。read_write修飾子、共有仮想メモリ (Shared Virtual Memory) や動的並列処理 (Dynamic Parallelism) 対応など。
2015年11月16日、OpenCL 2.1を正式発表。SPIR-V中間言語によるVulkan API (OpenGL Next Generation, glNext) とのプログラミング基盤共通化など。2015年3月3日の暫定仕様の発表時点でカーネル記述言語へのC++14サブセット導入も予定されていたが、OpenCL 2.1正式仕様の発表とともに、OpenCL C++のリリースは早くて2016年半ばとアナウンスされた。
2017年5月16日、OpenCL 2.2を正式発表。2016年4月18日の暫定仕様の発表時点でアナウンスされていた、OpenCL C++言語、SYCL 2.2フレームワークに加えて、中間表現SPIR-V 1.2などが導入された。
2018年6月、AppleはWWDCで、macOS Mojave以降ではOpenCLを非推奨とすることを発表し、代替としてMetalを使うことを推奨するようになった。
2020年4月27日、OpenCL 3.0暫定仕様が公開された。OpenCLロードマップの再調整に伴い、バージョン1.2より後発の機能がオプションに引き下げられる。オプションの言語機能を照会するためのマクロが提供される予定。
2020年9月30日、OpenCL 3.0最終仕様が公開された。
SYCLはKhronos Groupが策定している、標準C++を使って「単一ソース」でヘテロジニアスプロセッサ向けのコードを記述することを可能にする抽象化レイヤーである。従来はOpenCL C/C++により記述したカーネル(デバイスコード)のコンパイルやロードを、OpenCL APIを使って実行するための処理をホストコード側に逐一記述する必要があったが、SYCLを利用することで、単一の言語を使って同一ソース内に記述できるようになる。コンセプトとしては、CUDA C++やC++ AMPに似ている。SYCLの拡張としてIntelのData Parallel C++ (DPC++) も存在する。
SYCL 2020より前はOpenCL仕様の上に構築されており、GPUバックエンドもOpenCLのみを前提としていた。SYCL 2020以降はOpenCLを介さないバックエンドも考慮されるようになった。
SYCLの実装には以下が存在する:
Intel oneAPI DPC++ Compiler
オープンソース。LLVMの派生であり上流にマージ予定となっている。
バックエンドはCPUおよびOpenCL+SPIR-V。またCodeplayによりCUDA+PTXバックエンドも追加された。
オープンソース。バックエンドにはOpenMP (CPU向け)、HIP/ROCm (AMD GPU向け)、CUDA (NVIDIA GPU向け) がある。またIntel GPUに向けてSYCLバックエンドも追加予定となっている。
ComputeCpp (Codeplay)
プロプライエタリ。
またXilinxの管理するtriSYCLも存在したが不完全なため非推奨となっており、代わりにIntelのLLVM実装に基づいたXilinxバックエンド実装が開発されている。その他、オープンソースの簡易実装のsycl-gtxもあった。
NVIDIAのGPUで使われるハードウェア依存の低級アセンブリ言語。NVIDIA Nsight開発環境がSASSレベルでのデバッグに対応している。SASSのアセンブラは、asfermiやMaxAsなどがある。SASS言語で書かれた例としては、NervanaGPUがある。
PTX (Parallel Thread Execution)
NVIDIAのGPU向けのハードウェア非依存な擬似アセンブリ言語。PTXのアセンブラは、ptxasがある。asm文によって、CUDAやOpenCLのコードにPTXのコードを埋め込むことも可能。
LLVM/ClangにはOpenCLのフロントエンドおよびPTXのバックエンドが含まれており、OpenCLからLLVM IRを通してPTXへと変換し、CUDA Driver APIで実行したり、ptxasでSASSへと変換することが可能。
AMD Intermediate Language (AMD IL)
AMDのGPU向けのハードウェア非依存な擬似アセンブリ言語。コンパイルは、CAL (Compute Abstraction Layer) APIのcalclCompile関数で行なう。。なおAMD ILのサブセットはローレベルグラフィックスAPIであるMantleでも利用されていた。
AMD Instruction Set Architecture (AMD ISA)
AMDのGPUで使われるハードウェア依存の低級アセンブリ言語。LLVMがTeraScale(VLIW4/5) およびGCNアーキテクチャに対応するR600バックエンドを持っており、LLVM/ClangでOpenCLからAMD ISAアセンブリへと変換したり、AMD ISAアセンブリからllvm-asでバイナリ化したりすることが可能。アセンブルしたバイナリはOpenCL APIのclCreateProgramWithBinary関数で実行する。
Intel GEN Assembly
Intelの内蔵GPU用のアセンブリであり、OpenCLコードのデバッグに使われている。Intel-gpu-tools 1.4以降にはIntelの第四世代GPU以降に向けたオープンソースのアセンブラー「intel-gen4asm」が含まれている。また、SYCLの実装系の一つIntel oneAPI DPC++ Compilerは低レベルラッパーのExplicit SIMD Programming Extensionを備えている。
TGSI (Tungsten Graphics Shader Infrastructure)
オープンソースなハードウェア非依存の中間言語。オープンソースGPUドライバーであるMesa 3D/Gallium3Dの中間表現形式として使われている。2013年現在、Gallium3D OpenCL実装のために、LLVMのTGSIバックエンドが開発中となっている。GPGPUだけでなく、グラフィックスにも対応している。
SPIR (Standard Portable Intermediate Representation)
クロノス・グループによって、OpenCLのために開発された中間言語。OpenCL 1.2とともにSPIR 1.2が、そしてOpenCL 2.0とともにSPIR 2.0が策定された。OpenCL 2.1およびVulkanとともに策定されるSPIR-Vでは、GPGPUだけでなく、グラフィックスにも対応している。
HSA Foundationで標準化されたヘテロジニアスシステムアーキテクチャ(HSA) 向けのハードウェア非依存な中間言語。AMDやLLVMのOpenCL実装がHSAIL中間表現形式の出力に対応している。異種コア間のスケジューリングを前提としており、グラフィックスには非対応。
OpenCLを使用したクライアント プログラムを開発するための代表的なソフトウェア開発キット(SDK)として、主に各ハードウェア ベンダーから下記のSDKが提供されている。
Windows, Linux, macOS用が提供されている。"CUDA Toolkit 7.5"時点でOpenCL 1.2に対応している。
かつてNVIDIAのOpenCL SDKは"NVIDIA GPU Computing SDK"に含まれていて、CUDA SDKとは独立していたが、CUDA 5.0からはCUDA Toolkitにすべて含まれるようになった。以前のバージョンのGPU Computing SDKはアーカイブとして公開されている。
AMD APP SDK
AMD Stream SDKの後継。Windows, Linux用が提供されていた。AMD APP SDK 3.0の時点でOpenCL 2.0、Standard Portable Intermediate Representation 1.2に対応していた。GPUOpenのGitHubサイトにて必要最低限の軽量なOCL-SDK (OCL_SDK_Light) が公開されているが、2017年を最後に更新されていない。
Windows および Linux 用が提供されている。開発ツールの OpenCL Tools もある。OpenCL 2.0、Standard Portable Intermediate Representation 1.2をサポートしている。IntelのICDと対応ハードウェアを搭載するAndroid環境でもOpenCLを利用することができる。
Intelの現行のOpenCL実装 (Neo) はマルチプラットフォームでオープンソースとなっている。以前はクローズドソースの古い実装 (Classic) とLLVMベースのオープンソース実装 (Beignet) の二つが存在した。また、以前は統合ツールとして Intel Integrated Native Developer Experience (Intel INDE) も提供されていたが、2018年に提供終了となった。
Snapdragon 向け
ARM Maliを採用したSoC向けだった。SDK v1.1時点でOpenCL 1.1に対応していた。ARM Compute Libraryに置き換えられた。
iPhone 7 以前などで使われている PowerVR 向け
IBM OpenCL SDK
PowerPC 上の Linux に向けたもの。Cell Broadband Engine (Cell/B.E.) にも対応していた。
macOSの標準機能としてOpenCLをサポートしている。OpenCL 1.2までをサポートするが、対応バージョンはハードウェアにもよる。macOS Mojave以降では非推奨である。
旧Altera SDK for OpenCL。FPGA上で動作するOpenCLプログラムを開発することができる。x86プロセッサ対応のエミュレータも提供されている。
Xilinx Vitis
FPGA上で動作するOpenCLプログラムを開発することができる。
なお古い開発環境としてXilinx SDAccelも存在したが2019.2を最後にVitisへと統合された。
OpenCLに対応している。
SPIR-Vでの出力にはまだ対応しておらず、"LLVM/SPIR-V Bi-Directional Translator" や LLVM-SPIRV-Backend  (LLVMに合流予定) が必要になる。
(Google)
OpenCL CのサブセットをVulkanのコンピュートシェーダーとして実行できるようにするためのコンパイラ。
OpenCLを正式サポートしていないAndroidにおいてOpenCLアプリケーションの移植を促進するために開発が始まった。clspvはいくつかのAndroidアプリケーションにて利用されている。
(Microsoft)
Direct3D 12上に実装されたOpenCL 1.2 APIの互換レイヤー。
各SDKには、標準OpenCL API用のC/C++言語用ヘッダーなどのほか、ベンダーごとに拡張された機能を使うためのライブラリなども含まれるため、ハードウェア ベンダーやOSに依存しないOpenCLプログラムを開発する場合は注意が必要となる。
OpenCL対応のプロファイラーが各社からリリースされている。従来の非並列プログラムと比較するとOpenCLプログラムはデバッグやチューニングが難しく、プロファイラーは性能ボトルネックの特定やコード改善に有効なツールである。
(有償)
マルチコアCPU対応のプロファイラーだが、OpenCLのほか、DirectXにも対応している。
(無償)
CPU/GPUのデバッギング/プロファイリング用ツール。OpenCLのほか、OpenGLやDirect3D (DirectCompute) 開発にも使用できる。GPUOpenに移管されたが、開発終了。
(無償)
OpenCLのほか、CUDA、Direct3D (DirectCompute)、およびOpenGLに対応している。
(無償)
GPUのサイクルレベルシミュレータ。CUDAおよびOpenCLに対応している。Linux専用であり、また実行にはNVIDIAドライバーが必要となる。
AMD OpenCL Emulator-Debugger (ocl-emu)(無償)
AMDによるOpenCLソフトウェアエミュレータのオープンソース実装。2012年10月12日版において、OpenCL 1.2に対応している。対応OSはMicrosoft Windows XP以降で、ビルドにMicrosoft Visual Studio 2008/2010を必要とし、また実行プラットフォームとしてAMD Accelerated Parallel Processing (AMD APP) SDKを必要とする。開発終了。
Khronos自身が正式に公開しているOpenCL APIはC/C++言語向けのヘッダーおよびC++言語用ラッパークラスのヘッダー(cl.hppおよびcl2.hpp)のみだが、各種言語用に下位レベルの言語バインディングや上位レベルのラッパーライブラリがオープンソースコミュニティなどによって開発されている。
C++ AMP - 並列計算向けのC++言語拡張。マイクロソフトによるDirectComputeをバックエンドとした実装がある。AMDによるOpenCLをバックエンドとした実装もあったが開発を終了している。
OpenTK (The Open Toolkit library)
ECMAScript (JavaScript)
Nokia (Firefox) - http://webcl.nokiaresearch.com/ 2021-03
Samsung (WebKit) - https://github.com/SRA-SiliconValley/webkit-webcl 2021-03
(2016年以降、開発終了)
- OpenCL, OpenGL, OpenAL, OpenMAX の Java ラッパー
LWJGL - OpenCL, OpenGL, OpenAL などの Java ラッパー
LuxMark - 定番のレンダリングベンチマーク。
x264 OpenCL - Phoronix Test Suiteに含まれるベンチマークの一つ。
CompuBench CL
Rodinia Benchmark Suite - 多種のベンチマークがある。
Parboil Benchmarks
PolyBench/GPU
SHOC benchmark suite
画像処理/映像処理においては、OpenCLもしくはCUDAによるGPGPU対応が進んでいる。また、3DCGの物理演算およびレンダリングも同様である。。
Adobe Premiere Pro CS6
Adobe Photoshop CC
V-Ray
OpenCV - OpenCV 2.4.3でOpenCLを使ったアクセラレータoclモジュールが追加された。
アルテラ オプティカルフロー - 車載FPGAを利用した物体検知システム。
FFmpeg  - 一部のフィルタのみ。
x264  - lookahead処理にOpenCLを使うことができる。
Bullet 3.x
2018年6月5日、AppleはWWDC 2018でOpenGL/OpenCLの非推奨化を発表し、macOS Mojaveにおいて(サポートはまだ打ち切られないものの)OpenGL/OpenCLは非推奨APIとなった。macOSがネイティブにサポートするOpenCLのバージョンは1.2が最後となっている。