OpenCL
[Wikipedia|▼Menu]
.mw-parser-output .hatnote{margin:0.5em 0;padding:3px 2em;background-color:transparent;border-bottom:1px solid #a2a9b1;font-size:90%}

この項目では、並列コンピューティングのフレームワークについて説明しています。旧称OpenCLの暗号化ライブラリについては「Botan」をご覧ください。

OpenCL
作者Apple
開発元Khronos Group

最新版3.0.14[1][2] / 2023年4月17日 (12か月前) (2023-04-17)
対応OSクロスプラットフォーム
種別API
ライセンスロイヤリティフリー
公式サイトwww.khronos.org/opencl
www.khronos.org/webcl
テンプレートを表示

OpenCL(オープンシーエル、: Open Computing Language)は、マルチコアCPUGPUCellプロセッサ、DSPなどによる異種混在の計算資源(ヘテロジニアス環境、ヘテロジニアス・コンピューティング: Heterogeneous)を利用した並列コンピューティングのためのクロスプラットフォームAPIである。主な用途は科学技術計算や画像処理に代表される高性能計算のためのアプリケーションソフトウェアの高速化(ハードウェアアクセラレーション)であり、シミュレーション可視化に用いるリアルタイム3次元コンピュータグラフィックスAPIとの連携も拡張機能として標準化されている。スーパーコンピュータサーバワークステーションパーソナルコンピュータのほか、携帯機器などでの利用も想定されており、組み込みシステム向けに必要条件を下げたOpenCL Embedded Profileが存在する。
仕様

OpenCLの仕様はAppleによって提案されたのち[3]、標準化団体クロノス・グループの作業部会OpenCL Working Group(旧Compute Working Group)によって策定されている。仕様はロイヤリティフリーオープン標準として公開されており、仕様に基づいたフレームワークの実装サードパーティーによって行われる。ただし、実装されたフレームワークに対して許諾される商標ライセンスに必要な仕様一致性テストには、'nominal fee'(名目上の手数料)が必要である[4]
特徴

OpenCLには次のような特徴がある。

CPU(CL_DEVICE_TYPE_CPU)、GPU(CL_DEVICE_TYPE_GPU)、およびCell/
FPGA/Xeon Phi[5]など(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)[6]

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以降[7]

OpenGLおよびOpenGL ESバッファテクスチャ、レンダーバッファとの連携(cl_gl.h、OpenCL 1.0以降の拡張[8]

EGL(英語版)のイメージ、ディスプレイ、同期オブジェクトとの連携(cl_egl.h、OpenCL 1.2以降の拡張)

Direct3D 10のバッファおよびテクスチャとの連携(cl_khr_d3d10_sharing; cl_d3d10.h、OpenCL 1.1以降の拡張)

Direct3D 11のバッファおよびテクスチャとの連携(cl_khr_d3d11_sharing; cl_d3d11.h、OpenCL 1.2以降の拡張)

DirectX 9のメディアサーフェイス連携(cl_khr_dx9_media_sharing; cl_dx9_media_sharing.h、OpenCL 1.2以降の拡張)

グラフィックスAPIとの関連性および相互運用性

OpenCL類似技術にNVIDIACUDA(後述)が存在するが、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とよく似ており、サポートされるかどうかはハードウェアデバイス次第である[9]。また、OpenGL/Direct3Dでは浮動小数点テクスチャすなわちデータストレージのフォーマットとしてFP32形式のほかにFP16形式を選択できるが、通例GPUが得意とする演算精度は単精度であるため、シェーダープログラム中で利用できる演算精度は一般的には単精度となり、倍精度や半精度はオプション扱いとなる[10]

OpenCLのイメージオブジェクトをサポートするデバイス (CL_DEVICE_IMAGE_SUPPORT) では、バイリニアフィルタリングなどの高速なハードウェア機能を利用することもできる[11]

以下にOpenGL関連の拡張を列挙する。

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]

プラットフォームとデバイス

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]


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:95 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef