2015-05-26 68 views
3

我有一些陣列(實際上推力:: device_vector) -如何使用CUDA將多個線程映射到具有不同線程數的線程的數組元素?

MyClass1 a[N]; 
int b[N]; 

,我必須使用填補

MyClass2 c[M]; 

一個[0]生成第一B [0]在C [元素]。 a [1]在c []中生成下一個b [1]元素,依此類推。要清楚,M = b [0] + b [1] + ... + b [N-1]。任何b [i]都可以爲零。我需要創建c [],然後使用M個線程並行處理其所有M個元素。

是否有編寫使用M根絲線一個內核,其中每個線程都知道(或爲O發現(1)時間),其對應MyClass1的在[]它被關聯到的方法嗎?

例如,如果我有N = 4和

int b[4] = {2,0,3,5}; 

然後M = 2 + 0 + 3 + 5 = 10,所以C []是大小爲10的,我需要10個線程(TID = 0 ... 9)並行處理c [],其中tid = i創建c [i]。這裏,

  • C [0]和C [1]將使用創建的[0],因爲B [0] == 2.
  • 否元件將被使用[1],因爲在b [1] == 0
  • C [2]至c [4]將使用創建的[2]。
  • C [5]至c [9]使用將要創建的[3]。

線程TID = 3的人都知道它應該創建C [3],但它怎麼會知道它應該使用[2]和產生其元素這樣做?

回答

1

我建議總結B []到B [],其具有元件

B[i] = sum(b[0] ... b[i]) 

因此M = B [N-1],現在其中對於每次使用std啓動中號泳道:: LOWER_BOUND在你想要使用的[]中查找和索引元素的i。

(我可能會做對cpu的第一步,你可能做類似的已經確定M.

PIDX東西 - B [I]會告訴你當前元素的「本地」索引你正在建設)

+0

我所有的數據是在設備上。最後,我剛去與發射N個線程,其中每個在C [](I使用的B []與此幫助前綴和)中的適當位置寫入其相應的B [TID]元素。我想也像你說的那樣進行二分搜索,但在我看來,通常M >> N,甚至O(log(M))都會比我的解決方案更糟糕,我想。如果可能的話,我會嘗試並報告。 –

相關問題