Clang 9 から, OpenCL カーネルで C++ の機能(C++17)が使えるようになってきました.
ただしこれは C++ 言語のフル実装(libc++ など STL なども含んだものという意図です)が OpenCL runtime 経由で GPU などで動くようになるというわけでもなく, OpenCL C++ の実装というわけではありません.
また, STL も利用できません.
template や class が使えて, 最近の CUDA C++ 言語や, Metal Shading Language のような感じでかけるようになった感じでしょうか.
auto や lambda 式も利用できますので, それなりにカーネルコードが記述しやすくなると想像します.
利用方法
-cl-std=clc++
もしくは -std=clc++
を指定します.
また, デフォルトでは get_global_id()
などは定義されないため, ドキュメントにあるように, 基本的にデフォルトヘッダファイルを読み込むオプションを指定します.
-Xclang -finclude-default-header
-Xclang
は, 後続のコンパイルオプションが clang 独自のものであることを指示するものです.
その他
SyCL
より完全な形(?)で C++ を Accelerator(e.g. GPU, FPGA) で動かすものとして, SyCL が提案されています.
OSS の実装は triSYCL, 商用(?)の実装は Codeplay 社による ComputeCPP があります.
どのくらい世の中で利用されているのかは不明ですが, Intel SyCL なるものも出てきているので以外と普及していくかも?
hipSyCL というのも出てきていました.
Intel OpenCL Clang
intel graphics compiler で使われています.
clang 9 以降でビルドすれば, C++ -> SPIR-V -> OpenCL compute kernel を実行できる Vulkan runtime で Vulkan で実行, というのが実現できそうかしらん?
clspv
SPIR-V 出力に特化した, clspv でも C++ を使うことができますが, こちらは現状 opencl1.2 の C++ 機能のみになります(C++98 相当?). いろいろいじれば C++17 も使える... かも?
TODO
- NanoSTL https://github.com/lighttransport/nanostl を利用することで, clang C++ for OpenCL で STL をいくらかサポートしたい