リポジトリは https://github.com/YusukeSuzuki/opencl.d に置いた。
動機と感想
個人的に使用するネイティブオブジェクトを出力するコンパイル言語はD言語に軸足を移そうと考えている。現在D言語のライブラリはC/C++ほどは数がなく充実したCライブラリを有効活用する意味でもCのライブラリを利用する手法を身につける必要があった。
個人的に興味があり、またdubで提供されていないOpenCLをD言語で利用する練習台にした。
OpenCLのC APIはプリミティブな関数の集合であるため実際の利用にはさらに高級なフレームワークを組む必要があるが一旦は使えるようになった。
D言語の場合、整数型のバイト数が言語により規定されているので型周りの書き換えは楽だった。
またOpenCL C APIはほとんどの構造体の実装を隠蔽しているため構造体のアライメントをそろえる部分の悩みは発生しなかった。
出来上がったD言語のモジュールを利用するには配列のポインタの仕様などCとは異なる部分で書き方を考える必要があった。このあたりは高級なフレームワークでラップしてしまった方が良いと思う。
参考資料
概ね C の .h ファイルから D のモジュールへの変換 に記述されている通りの手順で動作させることができた。
作業
- dubプロジェクトを作る
- dub.json に「"target" : "library"」、「"libs" : ["OpenCL"]」を記述
- source/ に cl.d を作って CL/cl.h をひたすらD言語の記述に書き換えていく。
迷ったところ
- 関数ポインタを渡すAPIの引数は function で記述すること。
できてない・わかっていないところ
- Windows向けにはAPIに __stdcall を付さなければならない。cl.h ではマクロで対応しているがD言語にはマクロがないため同一ソースファイルで切り替えることができていない。__stdcall を付すには(Windows)の記述をすればよいが同一ソースファイルで想定する全環境に対応するにはどうすればよいか。 → extern(System) で対応できた。本記事のコメントを参照。
- dubで利用できるようにしたい。ローカルリポジトリに登録する方法を身につけないといけない。
- ライセンスをどうしようか。