OpenCL

OpenCL（オープンシーエル、）は、マルチコアCPUやGPU、Cellプロセッサ、DSPなどによる異種混在の計算資源（ヘテロジニアス環境、ヘテロジニアス・コンピューティング、）を利用した並列コンピューティングのためのクロスプラットフォームなAPIである。主な用途は科学技術計算や画像処理に代表される高性能計算のためのアプリケーションソフトウェアの高速化（ハードウェアアクセラレーション）であり、シミュレーション可視化に用いるリアルタイム3次元コンピュータグラフィックスAPIとの連携も拡張機能として標準化されている。スーパーコンピュータやサーバ、ワークステーションやパーソナルコンピュータのほか、携帯機器などでの利用も想定されており、組み込みシステム向けに必要条件を下げたOpenCL Embedded Profileが存在する。
仕様.
OpenCLの仕様はAppleによって提案されたのち、標準化団体クロノス・グループの作業部会（旧）によって策定されている。仕様はロイヤリティフリーなオープン標準として公開されており、仕様に基づいたフレームワークの実装はサードパーティーによって行われる。ただし、実装されたフレームワークに対して許諾される商標ライセンスに必要な仕様一致性テストには、（名目上の手数料）が必要である。
特徴.
OpenCLには次のような特徴がある。
グラフィックスAPIとの関連性および相互運用性.
OpenCL類似技術にNVIDIAのCUDA（後述）が存在するが、OpenCLにはCUDA同様に、3DグラフィックスAPIであるOpenGL（クロスプラットフォーム）およびDirect3D（Windowsプラットフォーム専用）との相互運用性（）が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関連の拡張を列挙する。
プラットフォームとデバイス.
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では、および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日に発足した作業部会 において、AppleによってOpenCLの仕様草案が提案された。CWGはGPUとCPUのヘテロジニアス（異種混在）な計算技術のロイヤリティフリーな標準化を目的としており、発足時点では3Dlabs、AMD、アップル、ARM、Codeplay、エリクソン、フリースケール・セミコンダクタ、Graphic Remedy、IBM、、インテル、ノキア、NVIDIA、モトローラ、QNX、クアルコム、サムスン、Seaweed、テキサス・インスツルメンツ、スウェーデン・ウメオ大学が参加している。
2008年8月のSIGGRAPH 2008および同年11月の (SC08) において、仕様策定の進捗状況が発表され、同時期には名称をと改められ、新たにアクティビジョン・ブリザード、バルコ、ブロードコム、エレクトロニック・アーツ、エイチアイ、ケストレル研究所、Movidia、、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.
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の実装には以下が存在する:
またXilinxの管理するtriSYCLも存在したが不完全なため非推奨となっており、代わりにIntelのLLVM実装に基づいたXilinxバックエンド実装が開発されている。その他、オープンソースの簡易実装のsycl-gtxもあった。
OpenCL開発環境.
OpenCLを使用したクライアント プログラムを開発するための代表的なソフトウェア開発キット（SDK）として、主に各ハードウェア ベンダーから下記のSDKが提供されている。
各SDKには、標準OpenCL API用のC/C++言語用ヘッダーなどのほか、ベンダーごとに拡張された機能を使うためのライブラリなども含まれるため、ハードウェア ベンダーやOSに依存しないOpenCLプログラムを開発する場合は注意が必要となる。
OpenCLプロファイラー.
OpenCL対応のプロファイラーが各社からリリースされている。従来の非並列プログラムと比較するとOpenCLプログラムはデバッグやチューニングが難しく、プロファイラーは性能ボトルネックの特定やコード改善に有効なツールである。
ラッパー.
Khronos自身が正式に公開しているOpenCL APIはC/C++言語向けのヘッダーおよびC++言語用ラッパークラスのヘッダー（cl.hppおよびcl2.hpp）のみだが、各種言語用に下位レベルの言語バインディングや上位レベルのラッパーライブラリがオープンソースコミュニティなどによって開発されている。
採用事例.
画像処理/映像処理においては、OpenCLもしくはCUDAによるGPGPU対応が進んでいる。また、3DCGの物理演算およびレンダリングも同様である。。
macOSでの非推奨化.
2018年6月5日、AppleはWWDC 2018でOpenGL/OpenCLの非推奨化を発表し、macOS Mojaveにおいて（サポートはまだ打ち切られないものの）OpenGL/OpenCLは非推奨APIとなった。macOSがネイティブにサポートするOpenCLのバージョンは1.2が最後となっている。
OpenCLの代替として推奨されているAPIはMetalであり、コンピュートシェーダーをカーネルの記述に用いる。iOSではOpenCLはサポートされていないが、Metalを用いることでmacOS同様にGPGPUを実行することが可能となっている。