2013-05-02 53 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