2017-06-15 5 views
0

現在、私はOpenCLプログラム(オンラインコンパイル)を配布中です。OpenCLビルド:カーネルコードのストリングの利点

私のカーネルコードは、*.clファイルにあり、カーネル構築中に読み込まれます。カーネルソースコードを同じ目的のために*.clの代わりに直接読むことができる文字列リテラルに変換することも可能であると思います。

私の質問は、カーネルコードを文字列で書くことのメリットは?

+0

が '@ replace_me @'のような部品とすることができ、一つは動的に変更された値に置き換えると、ローカル配列のサイズ等の異なるパラメータで同じコード(ローカル配列を再コンパイルすることができサイズは定数でなければならないので、ローカル配列に異なるサイズが必要なときはいつでも再コンパイルできます)。 '__local float data [@replace_me _ @];' –

+0

コード内の文字列にコードを入れることをお勧めします。ファイルを開くよりもはるかに簡単です。 – DarkZeros

+0

@huseyintugrulbuyukisik:これらの定数プリミティブ( '-DSIZE = NUM​​')の転送にコンパイラ定義を使用する方が良いでしょうか? –

答えて

1

利点:

  • IOに対処する必要はありません。複数のファイルシステムをサポートしなければならない場合、これは苦しい(Windows、Linuxなど)ことがあります。
  • ユーザーにとっては簡単ですが、実行可能ファイルは1ファイルのみです。
  • 誰かが.clファイルを編集すると問題が発生することがあります。
  • コンパイルして出荷するのが簡単です。

例:

const char *KernelSource = "\n" \ 
"__kernel void square(     \n" \ 
" __global float* input,     \n" \ 
" __global float* output,    \n" \ 
" const unsigned int count)    \n" \ 
"{           \n" \ 
" int i = get_global_id(0);    \n" \ 
" if(i < count)       \n" \ 
"  output[i] = input[i] * input[i]; \n" \ 
"}           \n"; 

program = clCreateProgramWithSource(context, 1, (const char **) &KernelSource, NULL, &err); 
+2

欠点は、文字列を使用する場合、カーネルソースを変更するたびにホストプログラムを再コンパイルする必要があることです。カーネルをファイルに置いた場合、カーネルは独立してコンパイルできます。 – Ruyk