我包括我懷疑是不正確這裏的主人計劃的主要部分:有人可以解釋這個OpenCL程序有什麼問題嗎?
我不是指針,偉大又和想我可能已經分配的一些變量是錯誤的。
這裏是內核程序,它應該給什麼我的程序試圖做一個想法:
const char *KernelSource = "\n"
"__kernel void sumElements( \n"
" __global float* input, \n"
" __global float output, \n"
" __global int N) \n"
"{ \n"
" int i = get_global_id(0); \n"
" if(i < N) \n"
" output += input[i]; \n"
"} \n"
"\n";
也許正是這個原因導致了錯誤,因爲我從來沒有嘗試過SIMT如上面寫着一個變量。是否有可能做這樣的事情?我需要得到數組中所有元素的總和。
只需添加到Telgin的答案,各個元素相加所示(使用原子操作雖然在技術上可以實現的)是非常低效的。您可能需要考慮減少問題:例如,如果您的輸入具有N個元素,則創建I個工作項目,每個項目負責彙總N/I元素,然後(i)輸出部分彙總數組,然後累積回(ii)使用OpenCL內存屏障,並在輸出單個值之前讓一個工作項在設備上累積部分總和。 –
非常好!正如您所描述的,將變量更改爲指針。我認爲它具有*成功的變量類型使它成爲一個指針並且在變量dereferences之前呢? 你對原子操作是正確的。現在只返回1。我會做一些閱讀。 – Chucky
@Chucky是的,沒錯。在變量聲明中使用*會使其成爲一個指針,然後通過訪問指針處的值來取消引用它。另外,詹姆斯比爾比是正確的,因爲這是非常低效的,一旦你確定自己的工作是按照預期工作的,那麼你應該仔細閱讀減少計劃以使其更快。 – Telgin