OpenCLのソースコードってどう扱えばいいのかわからん!
っていうのはわりと使い始めた頃から感じていました。
ホスト側のコードの中にソースを埋め込むのもいいけど修正しにくそうだし可読性とかよろしくないし、じゃあ別ファイルに分けたとして実行時にそのファイルないと動かないしとか。
そんなことを考えていて、みんなどうしてるんだろうといろいろ探しまわった結果見つけたのがこれです。
#マクロを使えばいいんだ!
偉そうに便利って書いてますが、この方法はプリプロセッサを使える言語に限られてくると思います。
そもそも私自身がC++からでしか使ってないので他の言語からのことが頭からサッパリ抜けてました。
というかC、C++以外で使えないような気しかしませんが、ご了承下さい。
さてその方法ですが、とても単純で__VA_ARGS__というものを使います。
ご存知の通り__VA_ARGS__は可変個引数マクロというもので、これを活用することによってコンパイル時に別ファイルにあるソースコードを実行ファイルに埋め込むことができます。
用法はこちら。
#define OCLSTRINGIFY(...) #__VA_ARGS__
まずさきほど説明した__VA_ARGS__を使い__OCLSTRINGIFY__を定義します。
もちろん名前はなんでもいいです。
そして__OCLSTRINGIFY__でOpenCLのコードを囲みます。
ちなみに中身は適当です。
OCLSTRINGIFY(
__kernel void test( __global int* dst, __global const int* src )
{
dst[get_global_id(0)] = src[get_global_id(0)];
return;
}
);
そしてホスト側のコードから#includeで先ほど__OCLSTRINGIFY__で囲んだソースコードのファイルパスを指定します。
ここでは同じディレクトリ内にあるということにし、下記のようにします。
char src[] =
#include "test_device.cl"
こうすることによって実行時にソースコードが埋め込まれることになります。
あとは煮るなり焼くなり好きなようにclCreateProgramWithSourceでプログラムオブジェクトを作りましょう。
#おわり
こういう使い方はわりと一般的なものかもしれませんが、私みたいな哀れな子羊が存在する可能性があるかもしれないので書きました。
正直こんだけでいいのかと自問自答してますが、他に書くものがないので仕方ないね。
ちなみにオープンソースの物理演算エンジンであるBulletでもこういう使い方してるみたいです。
ともかく些細なことでもいいので便利にOpenCLが使えるようになって、豊かな並列コンピューティングな人生を歩みましょう。
次の担当は@telmin_orcaさんです!