2015-04-29 109 views
3

我是一個新的for openCL。如何從數組中獲得總和數組

我知道如何總結一維數組。但我的問題是如何從openCL中的1 1D數組中獲得一個sum數組。

int a[1000]; 
int b[1000]; 
....    //save data to a 
for(int i = 0 ;i < 1000; i ++){ 
    int sum = 0; 
     for(int j = 0 ;j < i; j ++){ 
     sum += a[j]; 
     } 
     b[i] = sum; 
    } 

任何建議是值得歡迎的。

+0

你可以看看ArrayFire中OpenCL sum函數的源代碼,它是開源的,在這裏:http://www.arrayfire.com/docs/group__reduce__func__sum.htm – arrayfire

+0

我想你說的是「前綴總和「或」掃描「。對不起,現在沒有答案,但像「prefix sum opencl」這樣的websearches會帶來一些結果,也許這已經有所幫助了。 – Marco13

+0

您的代碼是前綴總和。它相當於'for(int i = 0; i <1000; j ++){sum + = a [j]; b [i] =總和; }'。 –

回答

0

正如其他人所說 - 你想要做的是使用包含並行前綴和。如果你被允許使用OpenCL 2 they have a workgroup function for it - 他們應該從一開始就使用OpenCL 2,因爲它的使用頻率很高 - 所以現在我們讓每個人都自己實現它,通常很難以這種或那種方式實現。

查看http://http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html爲典型的算法來教這個。

在你提到的數字上,使用多個計算單元意味着你將用一個計算單元來攻擊它 - 所以只需重複兩次左右的循環 - 在64-256處,你將得到總和很多元素的速度非常快。基於工作組函數來獲得任意大小的通用縮減函數是讀者的一個練習。

0

這是一個順序問題。用另一種方式表示

b[1] = a[0] 
b[2] = b[1] + a[1] 
b[3] = b[2] + a[2] 
... 
b[1000] = b[9999] + a[999] 

因此,有多個線程不會幫助你。 這樣做的最佳方式是使用單個CPU。而不是OpenCL/CUDA/OpenMP ...

這個問題是完全不同的減少,每個步驟可以分爲2個小步驟,可以並行運行。

+0

我認爲你的答案應該解決OPs代碼。即使效率低下,他的代碼也並不重要。他做了'O(n^2)'讀取(實際上'(n-1)* n/2'讀取)和'n'寫入。而你的建議只做'讀'。這顯然更好,但並行並不是微不足道的(它可以通過兩遍)。 –