2012-10-23 35 views
0

簡短版本:如何在CUDA中實現高效的過濾操作?CUDA過濾隊列

長版: 我有如下隊列過濾語義一個CUDA代碼。 我在隊列中有500萬個初始元素,代碼使用「昂貴的」階段式計算對它們進行過濾。預期最終結果將保留約1000個元素,並且每個階段中被去除的元素的數量遵循指數衰減曲線(即,第一階段消除很多,最後階段消除很少)。由於在GPU中每個元素都是並行處理的(通過線程塊),所以簡單地運行「所有元素上的所有階段」是相當浪費時間的。在給定階段,可以保留一個元素,所有其他元素可能已經被刪除,但即使對於已經「準備被刪除」的元素,計算仍然在所有剩餘階段繼續。

更有效的方法是分別運行每個階段,讀取輸入列表並將結果存儲爲中間輸出列表;然後讓事情按照乒乓模式運行。然而,這樣做會產生重要的全局內存讀寫操作,更重要的是對同步輸出列表上的併發寫入的atomicInc施加壓力。

你會如何建議做這樣的階段性過濾?

感謝您的回答和建議。

回答

3

我建議你使用compactremove_if。您可以使用CUDPP庫或thrust。除非您將計算所有元素的所有階段,否則無法避免在每個階段後寫入全局內存。

這是簡單的僞代碼:

  1. 初始化存儲器等
  2. 的foreach階段做
  3. 運行過濾所有元素的所有元素
  4. 使用緊湊/的remove_if
  5. 重寫元件或做別的東西(取決於使用的庫)
  6. 如果最後階段中斷其他轉到4
+1

也看看'thrust :: copy_if'。我認爲'remove_if'是一種排序,在您的情況下可能會更貴。同時查看ArrayFire庫,該庫對於單個GPU是免費的。如果您想實現自己的算法,請閱讀[優化CUDA中的並行縮減](http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/projects/reduction/doc/reduction.pdf) 。 –