2013-05-07 50 views
0

我異步地調用內核KerAKerB。內核KerC依賴於KerB完成,但獨立於KerA。那麼如何以這樣的方式撥打cudaDeviceSynchronize()這意味着KerC等待KerB完成但不是KerA僅爲特定內核調用cudaDeviceSynchronize()

Time --------------------------> 
| KerA ------------------------> 
| KerB ------> | KerC ---------> 

回答

3

您可以通過CUDA流實現此目的。

如果你不使用任何流,默認流(又名流「0」)時,和你沒有併發(好象cudaDeviceSynchronize()之前,每個CUDA操作,參見these slides之後插入)。

但是,如果KerA在流0,KerB運行,並在流1 KerC來看,你會得到你想要的東西,KerBKerC之間即同步調用,這是異步w.r.t. KerA。您可以使用cudaStreamSynchronize(streamid)來同步w.r.t.一個特定的流。

Time ------------------------------------> 
| Stream 0: KerA ------------------------> 
| Stream 1: KerB ------> | KerC ---------> 

的例子是在slides我聯繫可用。您還可以檢查SDK的simpleStreamsconcurrentKernels示例。

+0

謝謝。我之前沒有使用固定內存,所以請你也可以澄清使用「'cudaMemcpyAsync」與來自'pinned'內存的主機的要求。目前,我正在使用Thrust將100MB數據上傳到設備,而無需在我的代碼開始處使用流 - 如果稍後在我的代碼中使用流,每個流是否仍具有讀取此數據的權限?我可以使用多少固定內存 - 超過100MB?如果沒有固定的內存,流將無法工作? – mchen 2013-05-07 13:44:47

+0

此外,流可以進一步拆分成子流? – mchen 2013-05-07 13:49:52

+0

如果你想做一些異步的memcpy,你需要擔心固定內存和['cudaMallocHost'](http://docs.nvidia.com/cuda/cuda-runtime-api/index.html#group__CUDART__MEMORY_1g9f93d9600f4504e0d637ceb43c91ebad)。是的,每個流都可以訪問全局內存,但是您需要確保不同的流不會產生RAW/WAW危害(「並行操作使用的數據應該是獨立的」)。不,據我所知,沒有子流這樣的東西(除非我們正在談論最新的支持動態並行的GPU)。 – BenC 2013-05-07 14:10:57