0
簡短版本:如何在CUDA中實現高效的過濾操作?CUDA過濾隊列
長版: 我有如下隊列過濾語義一個CUDA代碼。 我在隊列中有500萬個初始元素,代碼使用「昂貴的」階段式計算對它們進行過濾。預期最終結果將保留約1000個元素,並且每個階段中被去除的元素的數量遵循指數衰減曲線(即,第一階段消除很多,最後階段消除很少)。由於在GPU中每個元素都是並行處理的(通過線程塊),所以簡單地運行「所有元素上的所有階段」是相當浪費時間的。在給定階段,可以保留一個元素,所有其他元素可能已經被刪除,但即使對於已經「準備被刪除」的元素,計算仍然在所有剩餘階段繼續。
更有效的方法是分別運行每個階段,讀取輸入列表並將結果存儲爲中間輸出列表;然後讓事情按照乒乓模式運行。然而,這樣做會產生重要的全局內存讀寫操作,更重要的是對同步輸出列表上的併發寫入的atomicInc施加壓力。
你會如何建議做這樣的階段性過濾?
感謝您的回答和建議。
也看看'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) 。 –