这个CUDA代码是按顺序和异步执行的吗?

时间:2013-05-02 11:53:52

标签: cuda

  • 下面的代码会按顺序执行吗? (我无法将cudaMemcpy2DArrayToArray()的设备到设备副本放在stream
  • 以下代码是否会异步执行? (cudaMemcpy2DArrayToArray()没有异步对应物)

我知道代码示例可以更有效地实现,但它只是作为一个例子。

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.
}

1 个答案:

答案 0 :(得分: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,因为此函数显示同步行为。