1
  • 下面的代码会按顺序执行吗?(我无法将设备到设备的副本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.
}
4

1 回答 1

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每一步,因为这个函数显示了同步行为。

于 2013-05-02T16:49:35.980 回答