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.
}
答案 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
,因为此函数显示同步行为。