OpenCL

マクロを使って便利にOpenCL

More than 3 years have passed since last update.

OpenCLのソースコードってどう扱えばいいのかわからん!
っていうのはわりと使い始めた頃から感じていました。
ホスト側のコードの中にソースを埋め込むのもいいけど修正しにくそうだし可読性とかよろしくないし、じゃあ別ファイルに分けたとして実行時にそのファイルないと動かないしとか。
そんなことを考えていて、みんなどうしてるんだろうといろいろ探しまわった結果見つけたのがこれです。

マクロを使えばいいんだ!

偉そうに便利って書いてますが、この方法はプリプロセッサを使える言語に限られてくると思います。
そもそも私自身がC++からでしか使ってないので他の言語からのことが頭からサッパリ抜けてました。
というかC、C++以外で使えないような気しかしませんが、ご了承下さい。

さてその方法ですが、とても単純でVA_ARGSというものを使います。
ご存知の通りVA_ARGSは可変個引数マクロというもので、これを活用することによってコンパイル時に別ファイルにあるソースコードを実行ファイルに埋め込むことができます。
用法はこちら。

#define OCLSTRINGIFY(...) #__VA_ARGS__

まずさきほど説明したVA_ARGSを使いOCLSTRINGIFYを定義します。
もちろん名前はなんでもいいです。
そしてOCLSTRINGIFYでOpenCLのコードを囲みます。
ちなみに中身は適当です。

test_device.cl
OCLSTRINGIFY(

__kernel void test( __global int* dst, __global const int* src )
{
    dst[get_global_id(0)] = src[get_global_id(0)];

 return;
}

);

そしてホスト側のコードから#includeで先ほどOCLSTRINGIFYで囲んだソースコードのファイルパスを指定します。
ここでは同じディレクトリ内にあるということにし、下記のようにします。

test_host.cpp
char src[] = 
#include "test_device.cl"

こうすることによって実行時にソースコードが埋め込まれることになります。
あとは煮るなり焼くなり好きなようにclCreateProgramWithSourceでプログラムオブジェクトを作りましょう。

おわり

こういう使い方はわりと一般的なものかもしれませんが、私みたいな哀れな子羊が存在する可能性があるかもしれないので書きました。
正直こんだけでいいのかと自問自答してますが、他に書くものがないので仕方ないね。
ちなみにオープンソースの物理演算エンジンであるBulletでもこういう使い方してるみたいです。
ともかく些細なことでもいいので便利にOpenCLが使えるようになって、豊かな並列コンピューティングな人生を歩みましょう。

次の担当は@telmin_orcaさんです!