2011-06-06 63 views
3

我想優化我的CUDA程序,方法是將數據傳輸與內核執行重疊。但CUDA SDK中的示例程序asyncAPI.cu太簡單了,無法提供幫助。使用CUDA流重疊數據傳輸和內核執行

我沒有搜索這個問題,發現一些教程使用兩個CUDA流實現重疊。在我的情況下,需要計算大量的數據,因此我需要循環並將每個迭代的一部分數據分派到GPU。但我不怎麼寫這樣的循環,因爲所有的操作都是異步的,恐怕傳輸的數據會擦除/覆蓋當前正在計算的那些數據。

有沒有人經歷過這個?
任何幫助將不勝感激。

回答

2

你應該記住的一件事是,同一個流中的操作將按順序執行,並且只會與其他流中的操作重疊。當我使用流時,我的方法是爲每個要使用的流分配不同的內存位置。這將消除流之間的同步問題。如果由於內存限制,這不適合您,或者您需要在內核之間共享數據,則必須自己編寫同步程序。

此外,如果您對默認流執行任何調用,此蒸汽將在執行之前等待所有其他流完成,並且在默認流上運行某些流時不會執行其他流。

希望這會有所幫助。

+1

更詳細地說,例如,您可能還有一個用於輸入/輸出的單個數組,並且每個數據流都會在這些數組中接收到不同的偏移量。偏移量應根據每個流中的內核處理的元素數來計算,以便一個流中的線程不會觸及其他流使用的內存。 – harrism 2011-06-06 09:17:13

+0

是的,我得到了。非常感謝。但是,在一個循環中何時開始下一個數據傳輸。一段代碼片段將有所幫助。 – user435657 2011-06-06 09:21:39

+0

@harrism:聽起來很合理。另一個問題是,控制立即返回主機,並且如果在一個循環中將在前一個完成之前開始下一個數據傳輸。那麼,如何控制這種情況。要進行投票事件?或者有更好的解決方案?謝謝。 – user435657 2011-06-06 09:39:28