以下にOpenGL関連の拡張を列挙する。 OpenCL実行環境であるオペレーティングシステム上には、Installable Client Driver (ICD) Loaderという仕組みにより、複数のベンダーによるOpenCL実装を混在させることができる(cl_khr_icd)[16]。各ベンダーのOpenCL実装は「プラットフォーム」として抽象化され、OpenCL APIを通じて列挙・選択することができる。 またOpenCLはカーネルコードの実行ハードウェアを「デバイス」として抽象化する。各OpenCLプラットフォームは複数のOpenCLデバイスを持つことができ、OpenCL APIを通じて列挙・選択できる。 OpenCLのプログラム(アプリケーションソフトウェア)は、GLSLを利用したOpenGLプログラムとほぼ同じ要領で開発することができ、OpenCL C/C++を利用したデバイスコード(カーネルコード)と、OpenCL APIを利用したホストコードを別々に記述する[17]。カーネルコードのコンパイルは、clCreateProgramWithSource()関数経由でデバイスドライバーが実行する。CUDAプログラムのような専用オフライン コンパイラ(nvcc)を必要としないため、様々なプラットフォームへの展開が容易となることが利点である。ただしカーネルコードの初回の実行時コンパイル(オンライン コンパイル)に時間がかかるなどのデメリットも存在する。この点に関しては、実運用時にはclCreateProgramWithSource()関数によるオンライン コンパイルは行なわず、clGetProgramInfo()関数とclCreateProgramWithBinary()関数を用いてコンパイル済みバイナリからプログラムオブジェクトを生成する方法もある[18][19][20][21]が、ベンダーごとのOpenCLバイナリ間における互換性は保証されない。デバイスドライバーにカーネル記述言語のオンラインコンパイラの役割を持たせることで、ベンダー独自の拡張を実装しやすくなるが、コンパイラ品質はデバイスドライバーの品質に左右される。 なお、OpenCL 1.2、2.0、2.1、2.2では、SPIR 2008年6月10日(日本時間)のWorldwide Developers Conference (WWDC 2008) において、Mac OS X Snow Leopard(v10.5 Leopardの次期メジャーバージョンとされる)に搭載される予定の技術の1つとして初めて発表された[26]。 標準化団体クロノス・グループの2008年6月16日に発足した作業部会Compute Working Group (CWG) において、AppleによってOpenCLの仕様草案が提案された[3]。CWGはGPUとCPUのヘテロジニアス(異種混在)な計算技術のロイヤリティフリーな標準化を目的としており、発足時点では3Dlabs、AMD、Apple、ARM、Codeplay
cl_apple_gl_sharing, cl_khr_gl_sharing: OpenCL 1.0の拡張[12]。
cl_khr_gl_event: OpenCL 1.2の拡張[13]。
cl_khr_egl_image, cl_khr_gl_msaa_sharing: OpenCL 2.0の拡張[14][15]。
プラットフォームとデバイス
プログラミングモデル
歴史
2008年8月のSIGGRAPH 2008および同年11月のSupercomputing 2008 (SC08) において、仕様策定の進捗状況が発表され、同時期にCompute Working Groupは名称をOpenCL Working Groupと改められ、新たにアクティビジョン・ブリザード、バルコ、ブロードコム、エレクトロニック・アーツ、エイチアイ、ケストレル研究所、Movidia、RapidMind(英語版)、TAKUMIが参加している。11月10日にはRapidMindが自社の並列コンピューティング開発環境においてOpenCLを採用すると発表した[27]。
2008年12月9日のSIGGRAPH Asia 2008において、正式版となるOpenCL 1.0の仕様が発表された[28]。またほぼ同時期に、AMDとNVIDIAはそれぞれ自社のGPGPU技術であるATI StreamおよびCUDAにおいてOpenCL 1.0をサポートすると発表した[29][30]。OpenCL 1.0対応の最初のプラットフォームとして、Mac OS X Snow Leopardが2009年8月28日にリリースされた。
2010年6月14日、OpenCL 1.1を正式発表[31]。float3型の追加、clSetKernelArg()関数以外のスレッドセーフ化[32]など。
2011年11月15日、OpenCL 1.2を正式発表[33]。分割コンパイル&リンク対応、SubDeviceの追加、SPIR 1.2拡張機能、3Dイメージの書き込み拡張機能[34]など。
2013年7月22日、OpenCL 2.0を正式発表[35]。