2017-06-15 57 views
0

我目前正在分發OpenCL程序(在線編譯)的過程中。OpenCL構建:串聯內核代碼的優勢

現在我的內核代碼位於內核編譯期間讀取的*.cl文件中。我認爲也可以將內核源代碼轉換爲字符串文字,這可以直接讀取,而不是爲了相同的目的而讀取。

我的問題是:stringfying內核代碼的優勢是什麼?

+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