OpenCL C言語の仕様

OpenCLの標準プログラム言語はC言語だ。仕様としてはC99を継承したものになるが、

  • C99標準ヘッダはなし
  • 関数ポインタは未サポート
  • 再帰は未サポート
  • 可変長配列は未サポート
  • ビットフィールドは未サポート

といった制限が与えられている。

ポインタは使えるが、ポインタからポインタの参照は同一カーネル内でしか保証されない。また、現状、64ビット浮動小数点(倍精度)は未サポートだが、将来対応予定のロードマップが敷かれている。

データパラレルプログラミング向けとして、

  • データタイプとして「Work Item」と「Work Group」をサポート
  • ベクトル型のデータ形式をサポート
  • 同期イベント命令のサポート

のような拡張も施されている。

ベクトル型はその要素の一部を処理対象とするような特殊なキャスト法もサポートされる。

OpenCL C言語のデータ型変数

OpenCL C言語のベクトル型変数

ベクトルの要素指定の機能はかなりシェーダ言語っぽい

OpenCLではホストプログラムとカーネルとで異なるアドレス空間を取り扱うため、型限定子としてGlobal,Localといった宣言を明確に行わなければならない。デフォルトではPrivateになるが、不用意なバグを回避するためにも、徹底しておく必要があるだろう。

そして、同様の理由から、カーネルの引数のポインタはGlobal,Local,またはConstantに限定され、グローバル変数もConstantとして宣言される必要がある。

OpenCLではホストプログラムとカーネルとで異なるアドレス空間を取り扱うため、ポインタの取り扱いに際しては入念な気配りが不可欠

算術関数の誤差精度については、単精度についてIEEE754準拠、倍精度についてはIEEE754追従と定義されている。倍精度で準拠ではなく追従となっているのは、例外処理に関して一部未サポート要素があるため。

また、OpenCL C言語では、よく利用される算術関数については、精度を妥協して速度を優先したものが用意される。"half_"と付けた算術関数では16ビット浮動小数点を用いて計算がなされ、同様に、"native_"を付けた場合は、そのカーネルが動作するプロセッサのネイティブ命令の算術関数をそのまま利用する指定になる。画像処理のようなケースでは多少、とある画素色の結果として誤差があっても見た目にはほとんど問題ならない。精度よりもむしろリアルタイム性の方が重視されたりする局面がデータパラレルコンピューティングには少なくない。そうした用途のための配慮仕様といったところだ。

この他、メモリバリアを制御するWork Group向け命令、OpenGLとの連携命令もサポートされる。

データ整合性を確保するための同期/メモリバリア命令

OpenGLとの連携用命令