2013-02-14 53 views
1

考慮下面的代碼CUDA:異步數據傳輸CUDA

CudaMemCpyAsync(H2d, data1...., StreamA); 
KernelB<<<..., StreamB>>>(data1,...); 
CudaMemCpyAsync(D2H, output using data1, ...., StreamA); 

何時 「CudaMemCpyAsync(D2H .....,StreamA);」在代碼開始?在KernelB執行結束後開始執行嗎?我是否替換「CudaMemCpyAsync(D2H .....,StreamA);」與「CudaMemCpy(D2H .....,StreamA);」如果我必須將KernelB的輸出複製回主機?

另外,固定的內存使用量在異步數據傳輸中是絕對必需的嗎?

在此先感謝。

回答

3

用戶創建的CUDA流相對於彼此和主機是異步的。發佈到相同CUDA流的任務將被序列化。所以在你的情況下,cudaMemCpyAsync(D2H, output using data1, ...., StreamA);將等待先前的內存複製完成。但是不能保證當這個內存拷貝啓動時,內核就會完成它的執行。因爲StreamAStreamB彼此是異步的w.r.t。

此外,主機不會等待這些流完成執行。

如果您希望主機等待流,您可以使用cudaDeviceSynchronizecudaStreamSynchronize

If you do not use pinned memory, the memory copies will not overlap with kernel execution.