这个CUDA代码会按顺序异步执行吗? 下面的代码会按顺序执行吗? (我无法将流中的cudaMemcpy2DArrayToArray()的设备到设备副本放入流中) 下面的代码是否会异步执行? (cudamemcpy2daryartarray()没有异步对应项)

这个CUDA代码会按顺序异步执行吗? 下面的代码会按顺序执行吗? (我无法将流中的cudaMemcpy2DArrayToArray()的设备到设备副本放入流中) 下面的代码是否会异步执行? (cudamemcpy2daryartarray()没有异步对应项),cuda,Cuda,我知道代码示例可以更有效地实现,但它只是一个示例 for( i=0; i<10; i++ ) { cudaMemcpy2DArrayToArray( dst, src ); // device to device copy. cudaBindTextureToArray( texture_reference, dst, ... ) // bind dst to texture. kernel<<< dimGr

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

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.
}
for(i=0;i(out)//计算数组。
cudamemcpy2dtoarayasync(src\u p,out,stream)//将结果复制到src。
}

由于所有内核调用和所有
cudamemcpy2dtoarayasync
调用都使用同一个流,因此将同步处理该调用。一个流不能同时执行多个操作。但是,如果希望多个流参与工作,可以执行以下操作:

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]) );
n流=8;
cudastreams_t streams[n流];
对于(无符号整数ii=0;ii

但是,这样您仍然稍微依赖于等待
cudamemcpy2daraytoarray
每一步,因为此函数显示同步行为。

由于所有内核调用和所有
cudamemcpy2dtoarayasync
调用使用同一个流,这将被同步处理。一个流不能同时执行多个操作同时。但是,如果您想要多个流到工作中,您可以采取以下形式:

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]) );
n流=8;
cudastreams_t streams[n流];
对于(无符号整数ii=0;ii

但是,这种方法仍然稍微依赖于等待
cudamemcpy2daraytoarray
每一步,因为此函数显示同步行为。

对此我不确定,但可能您可以使用
cudamemcpy3daasync
从数组异步复制到数组。因为
struct cudaMemcpy3DParms
具有字段f或者源和目标
cudaArray
。我不确定这一点,但可能您可以使用
cudamemcpy3daasync
从一个数组异步复制到另一个数组。因为
struct cudaMemcpy3DParms
具有源和目标
cudaArray
字段。我在cuda编程API中读到,设备到设备从fu复制没有后缀“Async”的nction仍然是异步的。因此,主机每次都会阻塞,直到
cudaMemcpy2DArrayToArray()
完成为止。
cudaMemcpy2DArrayToArray()
的API参考称它“在大多数用例中显示同步行为”在这种情况下,它可能会“更”异步,也可能不会,但我不会指望它。我在cuda编程API中读到,不带后缀“Async”的函数的设备到设备拷贝仍然是异步的。因此,主机每次都会阻塞,直到
CUDAMCPy2daryToArray()
完成了吗?cudamemcpy2daraytoarray()的API参考称它“在大多数用例中表现出同步行为”。在这种情况下,它可能会“更”异步,也可能不会,但我不会指望它。