我與蘋果提供here與OpenCL的還原例如導致結果不準確
後解剖這幾天,我瞭解的基礎知識OpenCL的減少例如工作;我已經將它轉換爲在C++(Openframeworks)上可靠運行的版本,並在輸入集中找到最大的數字。
然而,這樣做,有幾個問題已經出現如下:
爲什麼使用多遍?我能夠減少的最多的是兩個;後者通過只佔用非常少的元素,因此非常不適合openCL進程(即,堅持一次通過然後處理cpu上的結果會不會更好?)
當我將'count'元素數設置爲非常高的數字(24M以上)並將類型設置爲float4時,我得到的結果不準確(或完全錯誤)。爲什麼是這樣?
- 在OpenCL內核
,任何人都可以解釋什麼正在這裏進行:
while (i < n){
int a = LOAD_GLOBAL_I1(input, i);
int b = LOAD_GLOBAL_I1(input, i + group_size);
int s = LOAD_LOCAL_I1(shared, local_id);
STORE_LOCAL_I1(shared, local_id, (a + b + s));
i += local_stride;
}
,而不是正在這裏做了什麼?
#define ACCUM_LOCAL_I1(s, i, j) \
{ \
int x = ((__local int*)(s))[(size_t)(i)]; \
int y = ((__local int*)(s))[(size_t)(j)]; \
((__local int*)(s))[(size_t)(i)] = (x + y); \
}
謝謝! 小號
嘿,謝謝你的回覆。我理解第一個;我仍然想知道爲什麼後者(小得多)的減少不僅僅是在CPU上運行。由於不準確的問題 - 是的,我也這麼認爲(發現鏈接由下面的答案建議),但是當我使用int4而不是float4測試縮減時,不準確性仍然存在。是否有類似的int4錯誤範圍? –
有沒有innacuracies與「整數」,所以檢查你的代碼。整數運算總是精確的。 – DarkZeros
這就是我的想法,整數不能不準確! Aaand,我沒有編輯過上面鏈接的蘋果例子的代碼,所以我認爲它沒問題。然而,當這些元素是int4或float4時,當超過23個(ish)個m元素運行時,它會停止準確運行。從進一步測試來看,完全相同的事情發生在一個int2的數量超過約45m的數字上,而對於普通的舊int數據則超過了91m。我知道這些數字非常高(!),所以也許並不那麼重要,但我對這是什麼造成了興趣。 –