2012-08-16 86 views
1

考慮兩個代碼片段。cudaMemcpy()調用流

Snippet1 

cudaStream_t stream1, stream2 ; 
cudaStreamCreate(&stream1); 
cudaStreamCreate(&stream2); 
cudaMemcpyAsync(dst, src, size, dir, stream1); 
kernel<<<grid, block, 0, stream2>>>(...); 



Snippet2 
cudaStreamCreate(&stream1); 
cudaStreamCreate(&stream2); 
cudaMemcpy(dst, src, size, dir, stream1); 
kernel<<<grid, block, 0, stream2>>>(...); 

在這兩個片段,我發出的memcpy調用(snippet1異步和snippet2同步)

由於命令已經發出兩種不同的數據流,從我的理解可能有兩種情況可能重疊。

但是在Snippet2中,cudaMemcpy調用是同步的(又名阻塞)會導致我一個似是而非的結論,即cudaMemcpy和內核調用會一個接一個地執行。

哪一個纔是正確的結論?

要更簡潔地重新表述:當我們向流發出cudaMemcpy調用時,它會阻止「完整代碼」還是阻止它發出的流?

+0

第二個代碼片段無效。 'cudaMemcpy'不能接受流號碼作爲參數,它總是在默認流中提交。 – talonmies 2012-08-16 13:09:09

回答

1

在操作完成之前,同步調用不會將控制權返回給CPU,所以在memcpy完成之前,您的第二個片段甚至不會開始提交內核啓動。

您的cudaMemcpy()調用看起來不正確;我不認爲你可以指定流參數給任何不以「異步」結尾的memcpy變體。正如所寫,編譯器可能會接受代碼並將流作爲memcpy方向。