2012-06-23 46 views
5

Cuda非常棒,我使用它像瘋了一樣,但我沒有充分利用她的潛力,因爲我遇到了一個轉移內存的問題,並且想知道是否有更好的方法可以獲得一個可變的內存數量。基本上我發送65535項目數組到CUDA和CUDA分析每個數據項目大約20,000種不同的方式,如果我的程序邏輯中有一個匹配項,那麼它會保存一個30個int列表。想想我對每種不同組合進行分析的邏輯,然後查看總數,並且如果總數等於我正在查找的數字,那麼它會保存結果(每個分析項目爲30個整數列表)。從Cuda傳輸大量可變內存

問題是65535(數據數組中的塊/項)* 20000(每個項目測試的總組合)= 1,310,700,000。這意味着我需要創建一個這樣大小的數組來處理所有數據都是正匹配的可能性(這是極不可能的,並且創建內存似乎很瘋狂)。我不得不把它縮小併發送更少的塊來處理,因爲我不知道如果Cuda可以有效地寫入鏈表或動態大小的列表(通過這種方法,它使用塊將輸出寫入主機內存* number_of_different_way_tests)。

有沒有更好的方法來做到這一點? Cuda可以以某種方式寫入不是由blockid派生的空閒內存?當我在CPU上測試這個過程時,少於10%的項目數組有正匹配,所以我不太可能在每次向內核發送工作時使用這麼多的內存。

p.s.我看上面,雖然它正是我在做什麼,如果它混淆然後另一種思考方式(不完全是我在做什麼,但足夠了解這個問題)是我發送20,000個數組(每個包含65,535項),並添加每個項目與其他陣列中的對等體,如果總數等於一個數字(比如200-210),那麼我想知道它添加的數字以獲得匹配結果。如果數字範圍非常廣泛,那麼不是所有的匹配,但使用我的方法,我被迫malloc,大量的內存。我可以用mallocing減少內存來捕獲結果嗎?我目前的方法是儘可能多地使用malloc,但是我不得不少運行效率低的塊(我希望一次運行儘可能多的塊和線程,因爲我喜歡Cuda組織和運行塊的方式) 。是否有任何Cuda或C技巧我可以用於這個或我堅持mallocing最大可能的結果(和購買更多的內存)?

+0

幾行代碼如何? – wallyk

+0

如果正面匹配很少,我在[本答案](http://stackoverflow.com/q/11148860/442006)中描述的替代過程可能非常適合。你會每次增加30個指數。 –

+0

hey @wallyk有什麼不清楚的地方可以解釋一下嗎?或者如果您覺得需要代碼,那麼我可以創建一個Sperate示例(因爲我的實際代碼庫相當龐大並且依賴於其他文件,所以我覺得它會更容易混淆,然後有用)。 – Lostsoul

回答

0

As Per Roger Dahl's great answer: 您正在尋找的功能稱爲流壓縮。

您可能確實需要提供一個數組,其中包含每個線程4個解決方案的空間,因爲嘗試直接以緊湊形式存儲結果可能會在線程之間創建如此多的依賴關係,以至於能夠複製較長的內核執行時間會減少回主機的數據丟失。這是一個例外,如果幾乎所有的線程都找不到解決方案。在這種情況下,您可能可以使用原子操作來維護數組中的索引。因此,對於找到的每個解決方案,都可以將其存儲在索引中的數組中,然後使用原子操作來增加索引。我認爲爲此使用atomicAdd()是安全的。在存儲結果之前,線程將使用atomicAdd()將索引增加1。 atomicAdd()返回舊值,線程可以使用舊值作爲索引存儲結果。

但是,考慮到更常見的情況,在有相當多的結果的情況下,最好的解決方案是將壓縮操作作爲單獨的步驟執行。一種方法是使用thrust :: copy_if。看到這個問題的更多背景。