2012-04-19 94 views
0

我有一個產生結果值數組的內核,我想高效地找到這些值的最大值。該數組在內核開始時被初始化爲一些負值(例如-1)。例如,內核使用5個塊,每塊256個線程執行。CUDA在共享內存中找到最大值

這裏有問題:

  1. 因爲我的數據,我必須終止線程,無效的,所以我有256個線程,有時50,20等,有時工作。

  2. 在共享內存中寫入塊的結果,但正如我所提到的,某些數組有50個結果,有些結果有256個......(因此共享數組看起來像這樣)8,6,4,9,1, -1,-1,-1 ...

  3. 在那種情況下如何在一個塊中有效地找到最大值?

在這些類型的數組上並行壓縮會很複雜,不是嗎?這個怎麼做 ?

+0

完成,sry我很新:) – Hlavson 2012-04-19 12:27:29

+0

你是什麼意思與'終止'線程?爲該線程做一個「返回」?因爲不推薦 – pQB 2012-04-19 14:03:52

+0

您是否考慮過使用其中一個免費庫來查找最大值(例如ArrayFire)? – arrayfire 2012-04-19 14:53:13

回答

2

關於您的算法沒有足夠的信息。

你是什麼意思的n結果? 數組中被忽略的值是否設置爲-1或者您使用動態外部共享內存,並且線程只寫入索引n(聽起來很難實現)?

  • 使用一個固定大小的共享內存和一組忽略值-1,仍執行並行減少,如果搜索最大正和它充滿了-1沒關係,或

  • 唐「T終止線程,而不是設置一個標誌,在另一個數組,如果線程不應該執行進一步的計算,仍然做平行減少

+0

我解決了它與並行減少,與我的數據和索引-1,其中不是以前的計算數據,它的工作原理:-) – Hlavson 2012-04-20 16:11:31

0

您可以您的內核中做的減少(如djmj說的),或者你可以使用推力結合函數和減少(例如tr ansform_reduce)。 CUDA工具包中包含Thrust,有關transform_reduce的示例,請參見this page