OpenCL

出典: フリー百科事典『ウィキペディア(Wikipedia)』

出典: フリー百科事典『ウィキペディア(Wikipedia)』
検索に移動
OpenCL
作者 アップル
開発元 Khronos Group
最新版 2.2-11[1][2] / 2019年7月19日(13か月前) (2019-07-19
対応OS クロスプラットフォーム
種別 API
ライセンス ロイヤリティフリー
公式サイト www.khronos.org/opencl
www.khronos.org/webcl
テンプレートを表示

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

仕様[編集]

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

特徴[編集]

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

  • CPU(CL_DEVICE_TYPE_CPU)、GPU(CL_DEVICE_TYPE_GPU)、およびCell/FPGA/Xeon Phi[4]など(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)[5]
  • 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以降[6]
  • OpenGLおよびOpenGL ESバッファテクスチャ、レンダーバッファとの連携(cl_gl.h、OpenCL 1.0以降の拡張[7]
  • OpenGL ESのイメージ、ディスプレイ、同期オブジェクトとの連携(cl_egl.h、OpenCL 1.2以降の拡張)
  • Direct3D 10のバッファおよびテクスチャとの連携(cl_d3d10.h、OpenCL 1.0以降の拡張)
  • Direct3D 11のバッファおよびテクスチャとの連携(cl_d3d11.h、OpenCL 1.2以降の拡張)
  • DirectX 9のメディアサーフェイス連携(cl_dx9_media_sharing.h、OpenCL 1.2以降の拡張)

OpenCLとグラフィクス[編集]

OpenCLカーネルの実行環境はGPUだけに留まらないため、グラフィックAPIよりも汎用的なAPIとなっている。例えばOpenCLでは画像オブジェクト (Image Object) が規定されているものの、画像オブジェクトに未対応のデバイスも考慮されており、それを使うためにはCL_DEVICE_IMAGE_SUPPORTで対応しているかどうかの確認をする必要がある。また、一般的なグラフィクスAPIやOpenCL類似のCUDA API(後述)と異なり、OpenCLでは半精度浮動小数点数 (half型) 及び倍精度浮動小数点数 (double型) の対応が公式拡張 (オプション) 扱いとなっており、一部実装系ではサポートされていない。

また、OpenCLの一部実装系(GPUなど)では公式拡張を使うことで他グラフィクスAPIとの画像の共有が可能である。OpenGL APIとの共有はcl_khr_gl_sharing拡張やcl_khr_gl_msaa_sharing拡張で、EGL (API)英語版 APIとの共有はcl_khr_egl_imageで、Direct3D 9 APIとの共有はcl_khr_dx9_media_sharing拡張で、Direct3D 10 APIとの共有はcl_khr_d3d10_sharing拡張で、Direct3D 11 APIと共有はcl_khr_d3d11_sharing拡張でサポートされる[8]

OpenCLの画像オブジェクトを採用している例としてはDaVinci ResolveDarktableなどのグラフィックソフトウェアがある[9]

プラットフォームとデバイス[編集]

OpenCL実行環境であるオペレーティングシステム上には、Installable Client Driver (ICD) Loaderという仕組みにより、複数のベンダーによるOpenCL実装を混在させることができる(cl_khr_icd)[10]。各ベンダーのOpenCL実装は「プラットフォーム」として抽象化され、OpenCL APIを通じて列挙・選択することができる。

またOpenCLはカーネルコードの実行ハードウェアを「デバイス」として抽象化する。各OpenCLプラットフォームは複数のOpenCLデバイスを持つことができ、OpenCL APIを通じて列挙・選択できる。

歴史[編集]

2008年6月10日(日本時間)のWorldwide Developers Conferenceにおいて、Mac OS X Snow Leopardv10.5 Leopardの次期メジャーバージョンとされる)に搭載される予定の技術の1つとして初めて発表された[11]

標準化団体クロノス・グループの2008年6月16日に発足した作業部会Compute Working Group (CWG) において、アップルによってOpenCLの仕様草案が提案された[12]。CWGはGPUとCPUのヘテロジニアス(異種混在)な計算技術のロイヤリティフリーな標準化を目的としており、発足時点では3DlabsAMD、アップル、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を採用すると発表した[13]

2008年12月9日のSIGGRAPH Asia 2008において、正式版となるOpenCL 1.0の仕様が発表された[14]。またほぼ同時期に、AMDとNVIDIAはそれぞれ自社のGPGPU技術であるATI StreamおよびCUDAにおいてOpenCL 1.0をサポートすると発表した[15][16]。OpenCL 1.0対応の最初のプラットフォームとして、Mac OS X Snow Leopard2009年8月28日にリリースされた。

2010年6月14日、OpenCL 1.1を正式発表[17]。float3型の追加、clSetKernelArg()関数以外のスレッドセーフ化[18]など。

2011年11月15日、OpenCL 1.2を正式発表[19]。分割コンパイル&リンク対応、SubDeviceの追加、SPIR 1.2拡張機能、3Dイメージの書き込み拡張機能[20]など。

2013年7月22日、OpenCL 2.0を正式発表[21]。read_write修飾子[22]、共有仮想メモリ (Shared Virtual Memory) や動的並列処理 (Dynamic Parallelism) 対応など。

2015年11月16日、OpenCL 2.1を正式発表[23]。SPIR-V中間言語によるVulkan API (OpenGL Next Generation, glNext) とのプログラミング基盤共通化など。2015年3月3日の暫定仕様の発表時点でカーネル記述言語へのC++14サブセット導入も予定されていた[24]が、OpenCL 2.1正式仕様の発表とともに、OpenCL C++のリリースは早くて2016年半ばとアナウンスされた。

2017年5月16日、OpenCL 2.2を正式発表[25]。2016年4月18日の暫定仕様の発表時点でアナウンスされていた、OpenCL C++言語、SYCL 2.2フレームワーク[26]に加えて、中間表現SPIR-V 1.2などが導入された。

2018年6月、AppleのWWDCで、macOS Mojave以降ではOpenCLを非推奨と発表し、代替としてMetalを使うことを推奨するようになった[27][28]

2020年4月27日、OpenCL 3.0暫定仕様が公開された[29]。OpenCLロードマップの再調整に伴い、バージョン1.2より後発の機能がオプションに引き下げられる。オプションの言語機能を照会するためのマクロが提供される予定。

SYCL[編集]

SYCLはKhronos Groupの制定する、標準C++を使って「単一ソース」でヘテロジニアスプロセッサ向けのコードを記述することを可能にする抽象化レイヤーである[30][31]。従来はOpenCL C/C++により記述したカーネル(デバイスコード)のコンパイルやロードを、OpenCL APIを使って実行するための処理をホストコード側に逐一記述する必要があったが、SYCLを利用することで、単一の言語を使って同一ソース内に記述できるようになる。コンセプトとしては、CUDA C++やC++ AMPに似ている。SYCLの拡張としてIntelのData Parallel C++ (DPC++) も存在する。

SYCL 2020より前はOpenCL仕様の上に構築されており、GPUバックエンドもOpenCLのみを前提としていた[32]。SYCL 2020以降はOpenCLを介さないバックエンドも考慮されるようになった[33][32]

SYCLの実装にはオープンソースのIntel oneAPI DPC++ Compiler[34] (LLVMフォークであり[35]上流にマージ予定[36]) 、オープンソースのhipSYCL[37]、CodeplayのComputeCpp[38][39]、sycl-gtx[38]などが存在する。またXilinxの管理するtriSYCLも存在した[38]が不完全なため非推奨となっており[40]、代わりにIntelのLLVM実装に基づいたXilinxバックエンド実装[41]が開発されている。

類似技術[編集]

OpenCLのように異種プロセッサをバックエンドとして活用するAPIは、GPGPU黎明期のものや、GPU専用のもの、特定のベンダー専用のもの、そして仕様が標準化されていないものまで含めると多数存在する。

現行の類似技術[編集]

CUDACompute Unified Device Architecture
NVIDIAによるGeForce / Quadro / Tesla / TegraシリーズGPU用のGPGPU開発・実行環境。C言語を拡張したCUDA Cによる開発を可能にする(Ver.2.2以降はC++言語を拡張したCUDA C++による開発も可能となっている)。NVIDIAによるコンパイラ実装nvccだけでなく、オープンソースコンパイラのLLVMでもCUDAコンパイラの実装が始まっている[42] [43]。また、PGI社からはCUDA Fortran Compilerが提供されている[44]
HIP (Heterogeneous-Compute Interface for Portability)
CUDAに近いカーネル言語およびAPI。AMDによるROCm (Radeon Open Compute) プラットフォームの一環として、オープンソースで提供されている[45]。実行環境としてAMD GPUに対応しているほか、バックエンドにCUDAコンパイラを利用することで、NVIDIA GPU上で動作可能なCUDAコードを生成することもできる。
CUDAコードをHIPコードへと変換するツールHIPIFYもオープンソースで提供されている[46]
C++ AMP
ハードウェアアクセラレートされた並列処理をC++言語で記述できるようにする高レベルのライブラリ・言語拡張。公式の実装としてはDirectComputeをバックエンドとするMicrosoft Visual C++がある。
またオープンソースのC++ AMP実装「HCC」も存在した[47]がその後非推奨となり[48]CUDA類似のHIP APIをベースとするHIP-Clangに置き換えられた[48]
OpenMP LEO (Language Extensions for Offload)
インテルによるIntel MIC (Many Integrated Core) およびGFXへオフロードするためのOpenMP拡張。ICC (Intel C++ Compiler) に実装されている[49]
OpenMP 4.0以降
offloadに対応している。GCCは5以降offloadに対応している[50]。LLVM/ClangもCUDAデバイスへのoffloadに対応しており[51]、LLVM 11でAMDのGCNベースのGPUへのoffloadにも対応する予定となっている[52]
OpenACC
OpenMPのようにコード中にディレクティブを挿入することで、並列処理のハードウェアアクセラレートを行なえるようにする規格[53]。PGIが開発した技術で、同社のPGIコンパイラに初めて搭載され[54]、その後、GCC 5.0以降にも搭載されている[55]
SPMD Programming Language
インテルによって開発された、C言語を拡張したSPMD英語版対応言語であり、Intel SPMD Program Compiler (ISPC) でコンパイル可能[56]。ISPCはオープンソースであり、バックエンドにLLVMを使用している[56]。IntelのCPUやXeon Phiだけでなく、NVIDIA Kepler GPUにも対応している[57]。ISPCを導入している例としては、オープンソースのレイトレーシングエンジンであるEmbreeがある[58]
DirectCompute
マイクロソフトが開発・配布しているDirectXテクノロジーのひとつであり、DirectX 11/DirectX 12セットに含まれるGPGPU向けのAPI。GPGPU向けのシェーダーステージとして導入されたCompute Shaderを利用する。HLSLをカーネル記述言語とする。グラフィックス連携用途を重視している[59]。動作環境はWindows Vista以降のWindowsおよびXbox One
OpenGL Compute Shader
DirectXに搭載されている前述のCompute Shader同様、OpenGLでもバージョン4.3でGPGPU向けのシェーダーステージが標準化された。GLSLをカーネル記述言語とする。バージョン4.6のGL_ARB_gl_spirv拡張によりSPIR-V中間表現に対応した。
Vulkan Compute Shader
OpenGLと同様にVulkanにもCompute Shaderがある。シェーダーコードの中間表現にはSPIR-Vが採用されており、オフラインコンパイルが可能であり、公式のオフラインコンパイラglslangValidator[60]は入力言語としてGLSLだけでなくHLSLにも対応している。
Apple Metal
AppleはOpenCLを非推奨とし、Apple Metalのcompute shaderを推奨している。カーネルの記述にはMetal Shading Language (MSL) を用いる。macOS/iOSなどのAppleプラットフォーム上でのみ利用可能。

過去の類似技術[編集]

Close to Metal英語版CTM, Close To the Metal
AMD社によるATI系GPUのストリームプロセッサインターフェイス。ハードウェアに近いローレベル制御を可能とする[61]
AMD Stream(旧ATI Stream
AMDによるATI系GPU用のGPGPU開発・実行環境。CTMをCompute Abstraction Layer(CAL)[62]によって抽象化し、Brook言語をCAL用に拡張したBrook+言語による開発を可能にする。なおAMDは「GPGPUでDirectX 11およびOpenCLをフルサポートする」と発表し[63] [64]CCC 11.2でRadeon HDシリーズ以上のGPU向けにOpenCLドライバーが標準搭載された[疑問点][要出典]
その後、同社はHSA推進とともに、独自規格ではなくOpenCLをヘテロジニアス戦略の中核とする方向に舵を切り直した。AMDによるCPU/GPU/APU対応の総合基盤テクノロジーは「AMD Accelerated Parallel Processing」(AMD APP)と呼ばれており、SDKの名称もATI Stream SDKからAMD APP SDKに変更・統一されたが、その後AMD APP SDKは廃止され、GPUコンピューティングの技術基盤はオープンソースのROCmプラットフォームに移行されることになった。
Sh英語版 (libsh)
ウォータールー大学コンピュータグラフィックス研究室の成果に基づいた、RapidMindによるシェーダープログラミングおよびGPGPUのためのメタプログラミング技術。C++言語による開発を可能にする。LGPLライセンスで公開されている。
RapidMind
RapidMind英語版による商用並列コンピューティング開発環境。GPU/マルチコアCPU/Cellプロセッサをバックエンドに利用できる。C++言語による開発を可能にする。
BrookGPU英語版 (Brook for GPU)
スタンフォード大学コンピュータグラフィックス研究室によるストリーム・コンピューティング開発環境。GPUおよびOpenMPによるマルチコアCPU演算をバックエンドに利用できる。C言語 (ANSI C) を拡張したBrook言語による開発を可能にする。BSDライセンスおよびGPLライセンスで公開されている。
PeakStream
PeakStreamによる商用ストリーム・コンピューティング開発環境。GPU / マルチコアCPU / Cellプロセッサをバックエンドに利用できる。PeakStreamは2007年6月頃までにGoogleによって買収されている。

関連技術[編集]

SASS
NVIDIAのGPUで使われるハードウェア依存の低級アセンブリ言語[65]。NVIDIA Nsight開発環境がSASSレベルでのデバッグに対応している[65]。SASSのアセンブラは、asfermi[66]やMaxAs[67]などがある。SASS言語で書かれた例としては、NervanaGPUがある[68][69]
PTX (Parallel Thread Execution)
NVIDIAのGPU向けのハードウェア非依存な擬似アセンブリ言語[70]。PTXのアセンブラは、ptxasがある[70]。asm文によって、CUDAやOpenCLのコードにPTXのコードを埋め込むことも可能[71][72]
LLVM/ClangにはOpenCLのフロントエンド[73]およびPTXのバックエンド[74]が含まれており、OpenCLからLLVM IRを通してPTXへと変換し、CUDA Driver APIで実行したり[75]、ptxasでSASSへと変換することが可能[75]
AMD Intermediate Language (AMD IL)
AMDのGPU向けのハードウェア非依存な擬似アセンブリ言語[76]。コンパイルは、CAL (Compute Abstraction Layer) APIのcalclCompile関数で行なう[77]asm文によって、OpenCLのコードにAMD ILのコードを埋め込むことも可能[要出典]。なおAMD ILのサブセットはローレベルグラフィックスAPIであるMantleでも利用されていた[78]
AMD Instruction Set Architecture (AMD ISA)
AMDのGPUで使われるハードウェア依存の低級アセンブリ言語。LLVMがTeraScale英語版(VLIW4/5) およびGCNアーキテクチャに対応するR600バックエンドを持っており[79][80]、LLVM/ClangでOpenCLからAMD ISAアセンブリへと変換したり、AMD ISAアセンブリからllvm-asでバイナリ化したりすることが可能。アセンブルしたバイナリはOpenCL APIのclCreateProgramWithBinary関数で実行する。
Intel GEN Assembly
Intelの内蔵GPU用のアセンブリであり、OpenCLコードのデバッグに使われている[81]。Intel-gpu-tools 1.4以降にはIntelの第四世代GPU以降に向けたオープンソースのアセンブラー「intel-gen4asm」が含まれている[82]。また、SYCLの実装系の一つIntel oneAPI DPC++ Compilerは低レベルラッパーのExplicit SIMD Programming Extensionを備えている[83]
TGSI (Tungsten Graphics Shader Infrastructure)
オープンソースなハードウェア非依存の中間言語[84]。オープンソースGPUドライバであるMesa 3D/Gallium3Dの中間表現形式として使われている。2013年現在、Gallium3D OpenCL実装のために、LLVMのTGSIバックエンドが開発中となっている[85]。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だけでなく、グラフィックスにも対応している[86]
HSAIL
HSA Foundationで標準化されたヘテロジニアスシステムアーキテクチャ英語版(HSA) 向けのハードウェア非依存な中間言語。AMDやLLVMのOpenCL実装がHSAIL中間表現形式の出力に対応している[87]。異種コア間のスケジューリングを前提としており、グラフィックスには非対応[88]

OpenCL開発環境[編集]

OpenCLを使用したクライアント プログラムを開発するための代表的なソフトウェア開発キット(SDK)として、主に各ハードウェア ベンダーから下記のSDKが提供されている。

NVIDIA CUDA Toolkit
Windows, Linux, macOS用が提供されている。かつてNVIDIAのOpenCL SDKは"NVIDIA GPU Computing SDK"に含まれていて、CUDA SDKとは独立していたが、CUDA 5.0からはCUDA Toolkitにすべて含まれるようになった。以前のバージョンのGPU Computing SDKはアーカイブとして公開されているが、CUDA Toolkitのページから直接たどることはできない[89] [90]。"CUDA Toolkit 7.5"時点でOpenCL 1.2に対応している[91] [92] [93]
AMD APP SDK
AMD Stream SDKの後継。Windows, Linux用が提供されていた。AMD APP SDK 3.0の時点でOpenCL 2.0、SPIR英語版 1.2に対応していた[94] [95] [96]GPUOpen英語版GitHubサイトにて必要最低限の軽量なOCL-SDK (OCL_SDK_Light) が公開されている[97][98]が、2017年を最後に更新されていない。
Intel SDK for OpenCL Applications
Windows および Linux 用が提供されている。開発ツールの OpenCL Tools もある。OpenCL 2.0、SPIR英語版 1.2をサポートしている[99] [100]。IntelのICDと対応ハードウェアを搭載するAndroid環境でもOpenCLを利用することができる[101][102][103][104][105]
Intelの現行のOpenCL実装 (Neo) はマルチプラットフォームでオープンソースとなっている[106]。以前はクローズドソースの古い実装 (Classic) とLLVMベースのオープンソース実装 (Beignet) の二つが存在した[106]。また、以前は統合ツールとして Intel Integrated Native Developer Experience (Intel INDE) も提供されていたが、2018年に提供終了となった[107]
Qualcomm Adreno SDK
Snapdragon 向け
ARM Mali OpenCL SDK
ARM Mali英語版を採用したSoC向けだった。SDK v1.1時点でOpenCL 1.1に対応していた。ARM Compute Libraryに置き換えられた。
Imagination PowerVR SDK
iPhone 7 以前などで使われている PowerVR 向け
IBM OpenCL SDK
PowerPC 上の Linux に向けたもの。Cell Broadband Engine (Cell/B.E.) にも対応していた[108][109]
OpenCL for macOS
macOSの標準機能としてOpenCLをサポートしている[110]。OpenCL 1.2までをサポートするが、対応バージョンはハードウェアにもよる[111]。macOS Mojave以降では非推奨である。
Intel FPGA SDK for OpenCL
旧Altera SDK for OpenCL。FPGA上で動作するOpenCLプログラムを開発することができる。x86プロセッサ対応のエミュレータも提供されている。
Xilinx Vitis
FPGA上で動作するOpenCLプログラムを開発することができる。
なお古い開発環境としてXilinx SDAccelも存在したが2019.2を最後にVitisへと統合された[112][113]
LLVM/Clang
OpenCL に対応している[114]
Clspv (Google)
OpenCL CのサブセットをVulkanのコンピュートシェーダーとして実行できるようにするためのコンパイラ[115]
OpenCLOn12[1] (Microsoft)
OpenCL 1.2をDirect3D 12環境で実行するための互換レイヤー。

各SDKには、標準OpenCL API用のC/C++言語用ヘッダーなどのほか、ベンダーごとに拡張された機能を使うためのライブラリなども含まれるため、ハードウェア ベンダーやOSに依存しないOpenCLプログラムを開発する場合は注意が必要となる。

OpenCLのプログラムは、GLSLを利用したOpenGLプログラムとほぼ同じ要領で開発することができ、CUDAプログラムのような専用オフライン コンパイラ(nvcc)を必要としないため、様々なプラットフォームへの展開が容易となることが利点である。ただし初回の実行時コンパイル(オンライン コンパイル)に時間がかかるなどのデメリットも存在する。この点に関しては、実運用時にはclCreateProgramWithSource()関数によるオンライン コンパイルは行なわず、clGetProgramInfo()関数とclCreateProgramWithBinary()関数を用いてコンパイル済みバイナリからプログラムオブジェクトを生成する方法もある[116] [117] [118] [119](ただしベンダーごとのOpenCLバイナリ間における互換性は保証されない)。なお、OpenCL 1.2、2.0、2.1では、SPIR英語版およびSPIR-Vと呼ばれる中間表現(中間言語バイトコード)をサポートすることにより、ベンダーに依存しないカーネルコードをコンパイル・実行することができるようになる[120]。ただし、SPIR 1.2およびSPIR 2.0はOpenCL 1.2およびOpenCL 2.0の拡張機能(cl_khr_spir[121])となっており、サポート必須の機能ではない。一方、SPIR-VはOpenCL 2.1のコア機能となる[122]

OpenCLプロファイラー[編集]

OpenCL対応のプロファイラーが各社からリリースされている。従来の非並列プログラムと比較するとOpenCLプログラムはデバッグチューニングが難しく、プロファイラーは性能ボトルネックの特定やコード改善に有効なツールである。

Intel VTune Amplifier(有償)
マルチコアCPU対応のプロファイラーだが、OpenCL[123]のほか、DirectXにも対応している[124]
AMD CodeXL(無償)
CPU/GPUのデバッギング/プロファイリング用ツール。OpenCLのほか、OpenGLやDirect3D (DirectCompute) 開発にも使用できる[125]
NVIDIA Nsight(無償)
OpenCLのほか、CUDA、Direct3D (DirectCompute)、およびOpenGLに対応している[126]

OpenCLシミュレータ/エミュレータ[編集]

GPGPU-Sim(無償)
GPUのサイクルレベルシミュレータ。CUDAおよびOpenCLに対応している。Linux専用であり、また実行にはNVIDIAドライバーが必要となる[127]
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を必要とする[128]

ラッパー[編集]

Khronosが公開しているOpenCL APIはC/C++言語向けのヘッダーおよびC++言語用ラッパークラスのヘッダー(cl.hpp)のみだが、各種言語用にラッパーライブラリがオープンソースコミュニティなどによって開発されている。

ベンチマーク[編集]

  • LuxMark - 定番のレンダリングベンチマーク。
  • x264 OpenCL - Phoronix Test Suiteに含まれるベンチマークの一つ[129]
  • CompuBench CL
  • Rodinia Benchmark Suite - 多種のベンチマークがある。
  • OpenDwarfs
  • Parboil Benchmarks
  • PolyBench/GPU
  • SHOC benchmark suite

採用事例[編集]

画像処理/映像処理においては、OpenCLもしくはCUDAによるGPGPU対応が進んでいる。また、3DCGの物理演算およびレンダリングも同様である。音声処理においては、DSPによる固定小数点処理が主流のため、GPGPUはあまり使われていない[要出典]

macOSでの非推奨化[編集]

2018年6月5日、AppleはWWDC 2018でOpenGL/OpenCLの非推奨化を発表し、macOS Mojaveにおいて(サポートはまだ打ち切られないものの)OpenGL/OpenCLは非推奨APIとなった。macOSがネイティブにサポートするOpenCLのバージョンは1.2が最後となっている[111]

OpenCLの代替として推奨されているAPIはMetalであり、コンピュートシェーダーをカーネルの記述に用いる。iOSではOpenCLはサポートされていないが、Metalを用いることでmacOS同様にGPGPUを実行することが可能となっている。

関連項目[編集]

脚注[編集]

[脚注の使い方]
  1. ^ The OpenCL™ Specification
  2. ^ The OpenCL™ Specification (PDF)
  3. ^ OpenCL Overview December 2008 (PDF) 、2008年12月
  4. ^ The OpenCL* Platform on Intel(R) Processors
  5. ^ The OpenCL Specification Version: 2.0; Document Revision: 29
  6. ^ Other Built-in Data Types
  7. ^ Khronos OpenCL Registry
  8. ^ The OpenCL Extension Specification Khronos Group 2019年
  9. ^ ROCm 3.7 Has Open-Source OpenCL Image Module Included Phoronix 2020年8月28日
  10. ^ OpenCL Installable Client Driver (ICD) Loader - khronos.org news
  11. ^ アップル、Mac OS X Snow Leopardをデベロッパにプレビュー、2008年6月10日
  12. ^ Khronos Launches Heterogeneous Computing Initiative、2008年6月16日
  13. ^ RapidMind Embraces Open Source and Standards Projects to Increase Focus on Simplifying Parallel Programming for Application Developers、2008年11月10日
  14. ^ The Khronos Group Releases OpenCL 1.0 Specification
  15. ^ AMD Adopts OpenCL™ 1.0 Specification Ratified Today by The Khronos™ Group, Reaffirms Commitment to Open Standards for CPU+GPU Compute、2008年12月8日
  16. ^ NVIDIA Adds OpenCL To Its Industry Leading GPU Computing Toolkit、2008年12月9日
  17. ^ Khronos Drives Momentum of Parallel Computing Standard with Release of OpenCL 1.1 Specification - Khronos Group Press Release
  18. ^ clSetKernelArg
  19. ^ Khronos Releases OpenCL 1.2 Specification - Khronos Group Press Release
  20. ^ write_image (3D)
  21. ^ Khronos Releases OpenCL 2.0 - Khronos Group Press Release
  22. ^ Access Qualifiers: read_writeはCUDA SurfaceやDirectCompute RWTextureといったDirectX 11世代の機能に相当する。
  23. ^ Khronos Releases OpenCL 2.1 and SPIR-V 1.0 Specifications for Heterogeneous Parallel Programming - Khronos Group Press Release
  24. ^ Khronos Releases OpenCL 2.1 Provisional Specification for Public Review - Khronos Group Press Release
  25. ^ Khronos Releases OpenCL 2.2 With SPIR-V 1.2 - Khronos Group Press Release
  26. ^ Khronos Releases OpenCL 2.2 Provisional Specification with OpenCL C++ Kernel Language - Khronos Group Press Release
  27. ^ Metal for OpenGL Developers - WWDC 2018 - Videos” (英語). Apple Developer. 2020年3月18日閲覧。
  28. ^ About OpenCL for OS X”. developer.apple.com. 2020年3月18日閲覧。
  29. ^ Khronos Group Releases OpenCL 3.0
  30. ^ SYCL Overview - The Khronos Group Inc
  31. ^ The Khronos Group Releases Finalized SYCL 1.2.1 - The Khronos Group Inc
  32. ^ a b SYCL Overview - SYCL 2020 is Here! Khronos Group 2020年
  33. ^ Khronos Steps Towards Widespread Deployment of SYCL with Release of SYCL 2020 Provisional Specification Khronos Group 2020年6月30日
  34. ^ Intel、新プログラミング言語「Data Parallel C++」β版公開 マイナビ 2019年11月21日
  35. ^ Intel's Initial Open-Source, LLVM-Based SYCL Compiler Is Now Available Phoronix 2019年1月28日
  36. ^ Intel Continues Working On Their SYCL Compiler For Upstreaming To LLVM Phoronix 2019年4月29日
  37. ^ hipSYCL Gets New Compilation Toolchain For Taking SYCL Directly To CUDA & ROCm Phoronix 2019年5月14日
  38. ^ a b c Khronos Group SYCL standard - triSYCL Open Source Implementation P.17 Xilinx 2016年
  39. ^ Codeplay Outs SYCL-Based ComputeCpp 1.0, Running Parallel C++ Code On Multiple Platforms Phoronix 2018年8月23日
  40. ^ Update project status in README triSYCL project 2020年7月3日
  41. ^ triSYCL/sycl: Experimental fusion of triSYCL with Intel SYCL upstreaming effort into Clang/LLVM
  42. ^ How To Compile CUDA Code With LLVM”. Phoronix (2015年11月11日). 2015年11月15日閲覧。
  43. ^ Compiling CUDA C/C++ with LLVM — LLVM 3.8 documentation”. LLVM Project (2015年11月13日). 2015年11月15日閲覧。
  44. ^ NVIDIAのCUDAアーキテクチャGPUにおけるFortranサポート
  45. ^ ROCm-Developer-Tools/HIP: HIP: C++ Heterogeneous-Compute Interface for Portability
  46. ^ ROCm-Developer-Tools/HIPIFY: HIPIFY: Convert CUDA to Portable C++ Code
  47. ^ AMDとMS,GPU演算用途向けのコンパイラ「C++ AMP v1.2」を発表 - 4Gamer.net
  48. ^ a b HCC Deprecation Notice AMD
  49. ^ Initiating an Offload on Intel® Graphics Technology Intel
  50. ^ OpenMP 4.0 Offloading For Intel MIC Lands In GCC 5 Phoronix 2014年11月13日
  51. ^ OpenMP Support LLVM project
  52. ^ LLVM 11 Merges AMD Radeon GCN Offloading For OpenMP Phoronix 2020年5月27日
  53. ^ OpenACC ディレクティブによるプログラミング by PGI Compilers
  54. ^ OpenACC ディレクティブによるプログラミング by PGI Compilers
  55. ^ OpenACC Changes Merged Today For GCC 5 Phoronix 2015年1月15日
  56. ^ a b Intel SPMD Program Compiler - Overview Intel Corporation
  57. ^ Intel SPMD Program Compiler User's Guide - Compiling For The NVIDIA Kepler GPU Intel Corporation
  58. ^ Embree Overview Intel Corporation
  59. ^ 後藤弘茂のWeekly海外ニュース
  60. ^ KhronosGroup/glslang: Khronos-reference front end for GLSL/ESSL, partial front end for HLSL, and a SPIR-V generator.
  61. ^ AMDのGPGPU戦略は新章へ - ATI Streamの展望、DirectX Compute Shaderの衝撃 (2) ATI Streamとは? | マイナビニュース
  62. ^ "Close to the Metal", Justin Hensley, AMD Graphics Product Group
  63. ^ AMD、DirectX 11/OpenCLのGPGPUをフルサポートへ
  64. ^ AMD Drives Adoption of Industry Standards in GPGPU Software Development
  65. ^ a b PTX and SASS Assembly Debugging NVIDIA
  66. ^ Kernelet: High-Throughput GPU Kernel Executions with Dynamic Slicing and Scheduling ( arXiv:1303.5164v1 [cs.DC] ) Jianlong Zhong, Bingsheng He
  67. ^ maxas - Getting Started Nervana Systems
  68. ^ MaxAs Nervana Systems
  69. ^ nervanagpu/nervanagpu/kernels/sass at master · NervanaSystems/nervanagpu · GitHub Nervana Systems
  70. ^ a b NVIDIA Compute - PTX: Parallel Thread Execution NVIDIA
  71. ^ Inline PTX Assembly in CUDA NVIDIA
  72. ^ NVIDIA OpenCL SDK Code Samples NVIDIA
  73. ^ Clang 3.0 Release Notes LLVM Project
  74. ^ User Guide for NVPTX Back-end LLVM Project
  75. ^ a b User Guide for NVPTX Back-end - Running the Kernel LLVM Project
  76. ^ AMD Intermediate Language Reference Guide - October 2011 v.2.4”. AMD (2011年10月). 2015年11月15日閲覧。
  77. ^ AMD CAL Programming Guide
  78. ^ Mantle Programming Guide and API Reference; Revision 1.0; March 6, 2015 p.93 AMD 2015年
  79. ^ LLVM 3.3 Release Notes LLVM Project
  80. ^ A Detailed Look at the R600 Backend AMD
  81. ^ Introduction to GEN Assembly Intel 2019年9月18日
  82. ^ Intel-gpu-tools 1.4 available LWN 2013年9月16日
  83. ^ Intel oneAPI DPC++ Compiler 2020-08 Released With Explicit SIMD Extension Phoronix 2020年8月21日
  84. ^ TGSI — Gallium 0.4 documentation
  85. ^ A Very Early Gallium3D TGSI Back-End For LLVM”. Phoronix (2013年4月22日). 2015年11月15日閲覧。
  86. ^ The first open standard intermediate language for parallel compute and graphics Khronos Group
  87. ^ AMD Accelerated Parallel Processing OpenCL™ User Guide - December 2014 rev1.0”. AMD. p. 3-14 (2014年12月). 2015年11月15日閲覧。
  88. ^ 【後藤弘茂のWeekly海外ニュース】 AMD GPUとモバイルGPUで同じプログラムを走らせるHSA構想
  89. ^ CUDA Toolkit 4.1 - archive
  90. ^ CUDA Toolkit 4.2 - archive
  91. ^ CUDA Toolkit 7.0以前のバージョンに含まれるのはOpenCL 1.1対応のヘッダーとライブラリのみである。また、Fermi世代以前のハードウェアではOpenCL 1.1どまりとなる。
  92. ^ Release 349 Graphics Drivers for Windows, Version 350.12; RN-W35012-01v01 | April 13, 2015; Windows Vista / Windows 7 / Windows 8 / Windows 8.1 KeplerおよびMaxwell世代以降のGeForceはWindows用350.12ドライバーでOpenCL 1.2に正式対応している。
  93. ^ Release 352 Quadro, NVS, Tesla, GRID, & Notebook Drivers - Version 353.06; RN-WQ35306-01_v01 | June 1, 2015; Windows 7, Windows 8, & Windows 8.1; Release Notes KeplerおよびMaxwell世代以降のQuadroおよびTeslaはWindows用353.06ドライバーでOpenCL 1.2に正式対応している。
  94. ^ AMD's APP SDK 3.0 Beta with OpenCL 2.0 support
  95. ^ AMD APP SDK v3.0 Beta Developer Release Notes
  96. ^ AMD OpenCL™ 2.0 Driver AMD OpenCL 2.0ドライバーはGCN第1世代以降のAMDグラフィックス製品と互換性がある。
  97. ^ GPUOpen-LibrariesAndSDKs/OCL-SDK
  98. ^ OpenCL SDK | Community
  99. ^ Intel® OpenCL™ Code Builder | Intel® Developer Zone
  100. ^ OpenCL* 2.0 の不均等なワークグループ | iSUS Broadwell世代以降のIntel CoreシリーズはOpenCL 2.0に対応している。
  101. ^ Installable Client Driver on Android* OS
  102. ^ インテル® SDK for OpenCL* Applications よくある問い合わせ | iSUS
  103. ^ Get Started with Intel® SDK for OpenCL™ Applications 2019 on Linux*...
  104. ^ Training & Code Samples for Intel® SDK for OpenCL™ Applications
  105. ^ Tutorial: Getting Started with OpenCL™ on Android* OS
  106. ^ a b compute-runtime Intel
  107. ^ Intel® Integrated Native Developer Experience - Discontinued Intel
  108. ^ OpenCL Development Kit for Linux on Power IBM 2009年10月30日
  109. ^ 『Languages and Compilers for Parallel Computing - 23rd International Workshop, LCPC 2010, Houston, TX, USA, October 7-9, 2010. Revised Selected Papers』 P.220 Keith Cooper, John Mellor-Crummey, Vivek Sarkar ISBN 978-3642195952
  110. ^ インテル® SDK for OpenCL Applications 2013 よくある問い合わせ | iSUS
  111. ^ a b OpenGL および OpenCL グラフィックスを扱う Mac コンピュータ - Apple サポート
  112. ^ レガシ ツール Xilinx
  113. ^ SDAccel 開発環境 Xilinx
  114. ^ OpenCL Features The Clang Team
  115. ^ Codeplay & Google Release Tool To Compile OpenCL C To Vulkan Phoronix 2017年7月14日
  116. ^ clGetProgramInfo
  117. ^ clCreateProgramWithBinary
  118. ^ OpenCL meets FPGA #1 入門編 - Qiita
  119. ^ Knowledge Base - AMD
  120. ^ クロノス・グループ、SPIR 2.0の暫定仕様を公開 - 日刊工業新聞 Business Line - 企業発表
  121. ^ cl_khr_spir
  122. ^ SPIR - The first open standard intermediate language for parallel compute and graphics
  123. ^ Intel® VTune™ Amplifier XE: Getting started with OpenCL* performance analysis on Intel® HD Graphics | Intel® Developer Zone
  124. ^ インテル® VTune™ Amplifier XE | iSUS
  125. ^ CodeXL for game developers: How to analyze your HLSL for GCN - AMD
  126. ^ NVIDIA Nsight Visual Studio Edition
  127. ^ gpgpu-sim/gpgpu-sim_distribution · GitHub
  128. ^ OpenCL Emu Documentation
  129. ^ a b Trying Intel OpenCL On Linux For Video Encoding Phoronix 2014年9月2日
  130. ^ CUDA/OpenCL/Mercury Playback Engine について(Adobe Premiere Pro)
  131. ^ Photoshop CC および CC 2014 GPU FAQ
  132. ^ Dev:2.6/Source/Render/Cycles/OpenCL - BlenderWiki
  133. ^ V-Ray Japanese official website - Chaos Group / Chaos Software / OakCorp.
  134. ^ V-Ray Japanese official website - Chaos Group / Chaos Software / OakCorp.
  135. ^ V-Ray RT and GPU rendering
  136. ^ GPUレイトレーシング | NVIDIA
  137. ^ OpenCV 2.2 Released - ROS robotics news
  138. ^ アルテラ、国際カーエレクトロクス技術展(カーエレJAPAN)に出展
  139. ^ オートモーティブワールド2015 開催直前情報:アルテラが披露するFPGAを活用した“今すぐ使える”車載向けソリューション - MONOist(モノイスト)
  140. ^ PixarAnimationStudios/OpenSubdiv · GitHub
  141. ^ FFmpeg 2.0 Released With OpenCL, Many Changes Phoronix 2013年7月10日