2013-05-02 51 views
1
  • 請問下面的代碼是否按順序執行? (我不能將cudaMemcpy2DArrayToArray()的設備到設備副本放在stream中)
  • 下面的代碼是否會異步執行? (cudaMemcpy2DArrayToArray()不具有異步對應)

我知道代碼樣品可以更有效地實施,但是它僅僅意在作爲示例。此CUDA代碼是否按順序和異步執行?

for(i=0; i<10; i++) 
{ 
    cudaMemcpy2DArrayToArray(dst, src);     // device to device copy. 
    cudaBindTextureToArray(texture_reference, dst, ...) // bind dst to texture. 
    kernel<<< dimGrid, dimBlock, 0, stream >>>(out)  // compute an array. 
    cudaMemcpy2DToArrayAsync(src_p, out, stream)   // copy result to src. 
} 
+0

我不確定這一點,但可能是你可以使用'cudaMemcpy3DAsync'異步地從陣列複製到陣列。由於'struct cudaMemcpy3DParms'具有源和目標'cudaArray'的字段。 – sgarizvi 2013-05-02 14:38:08

回答

1

由於所有內核調用和所有cudaMemcpy2DToArrayAsync調用都使用相同的流,因此將會同步處理。一個流不能同時做多件事。但是,如果你想多流的工作,你可以做形式的東西:

NSTREAMS = 8; 
cudaStream_t streams [NSTREAMS ]; 

for (unsigned int ii = 0; ii < NSTREAMS; ++ii) 
    HANDLE_ERROR(cudaStreamCreate(&(streams[ii]))); 

for(i=0; i<10; i++) 
{ 
    cudaMemcpy2DArrayToArray(dst, src);      // device to device copy. 
    cudaBindTextureToArray(texture_reference, dst, ...)  // bind dst to texture. 
    kernel<<< dimGrid, dimBlock, 0, stream[i] >>>(out)  // compute an array. 
    cudaMemcpy2DToArrayAsync(src_p, out, stream[i])   // copy result to src. 
} 


for (unsigned int ii = 0; ii < NSTREAMS; ++ii) 
    HANDLE_ERROR(cudaStreamDestroy(streams[ii])); 

但是,這樣你仍有小幅依賴等待cudaMemcpy2DArrayToArray每一步,因爲該功能顯示同步行爲。

+0

我在cuda編程API中讀取設備到設備的拷貝,但沒有後綴'Async'仍然是異步的。那麼主機每次都會阻塞,直到'cudaMemcpy2DArrayToArray()'完成? – Luc 2013-05-02 21:28:44

+0

'cudaMemcpy2DArrayToArray()'的API參考指出它「對大多數用例表現出同步行爲」。這可能會或可能不會是「更」異步的情況,但我不會指望它。 – Yellow 2013-05-03 15:20:48