2013-09-21 88 views
0

我有兩個功能:OpenCL內核參數歧義

void sum1(short * a, short * b, short * res, int size); 
void sum2(float * a, float * b, float * res, int size); 

,我有一個通用內核

__kernel void sum(__global const T * a, __global const T * b, __global T * res, int size) 
{ 
int x = get_global_id(0); 
if (x < size) res[x] = a[x] + b[x]; 
} 

是它安全地從編譯選項上面介紹的功能調用這個通用內核-DT = short和-DT = float分別?我是否需要使用對齊方式,還是OpenCL自動將內核參數與本例中的內核參數對齊到2和4字節?

通常,當我將cl_mem對象傳遞給內核時OpenCL不知道存儲在此cl_mem對象中的數據類型,我可以理解OpenCL如何將cl_mem對象轉換爲內核arg中的適當指針。需要幫助

回答

0

1-是的。直接使用-D T=short或在編譯時浮動是安全的。因爲它會生成2個適當的內核。 2-OpenCL(和其他帶指針的編程語言)明白你傳遞的指針是一個類型。在尋址內存時他們堅持這種類型。 至少在C中,這不是一個問題,因爲不允許使用自動指針轉換。如果指針不匹配,程序員會得到一個錯誤。

但是在OpenCL中,緩衝區的內存區域被認爲是泛型或無效指針。當您將它們分配給內核時,該轉換隱含在該分配中。但這並不意味着它是正確的!

例如。如果你創建一個浮點緩衝區,用浮點數填充它,用它作爲短內核的參數。結果將是錯誤的,因爲內核會解釋錯誤的緩衝區。但是,如果通過將短陣列傳遞給浮點內核來做錯誤,結果將是SEG_FAULT。

+0

謝謝,但對齊是什麼?程序員是否需要調整內核參數?或者當我們需要使用對齊時存在這種情況嗎? – sandye51

+0

只要不侵犯對像*(((char *)指針)+1)'這樣的元素的訪問權限,就不需要對齊任何數組或結構。但是,如果對齊,某些結構可能會更好。順便說一句,如果你只是使用單個元素的數組,就沒有任何對齊。 – DarkZeros