CUDA流并发和D2H数据传输重叠

CUDA流并发和D2H数据传输重叠,cuda,Cuda,我曾尝试将内核执行与memcpyasync D2H重叠,但它不起作用。我有N组元素。每个组有64个可以并行处理的元素。而由于数据依赖性,组的处理必须是顺序的。也就是说,必须在处理组i-1的元素之后处理组i的元素。对组中每个元素的处理产生一个输出,该输出必须从GPU传输到CPU。为了重叠此D2H数据传输,我将组的元素划分为多个块,以便可以使用流重叠给定块上的内核执行和D2H MemcpyAsync。我使用以下伪代码使用K流处理N组元素 groupId=0; `while( groupId<

我曾尝试将内核执行与memcpyasync D2H重叠,但它不起作用。我有N组元素。每个组有64个可以并行处理的元素。而由于数据依赖性,组的处理必须是顺序的。也就是说,必须在处理组i-1的元素之后处理组i的元素。对组中每个元素的处理产生一个输出,该输出必须从GPU传输到CPU。为了重叠此D2H数据传输,我将组的元素划分为多个块,以便可以使用流重叠给定块上的内核执行和D2H MemcpyAsync。我使用以下伪代码使用K流处理N组元素

 groupId=0;
`while( groupId< N){`

    for(i=0;i<K;++i)

// all stream must wait to complete the kernel execution
 of last stream before starting of the processing of next group

if( groupId!=0)

cudaStreamWaitEvent(stream[K-1],syncEvent,0)
kernelA<<< >>>(----,----,----);
CUDAEventRecord(syncEvent,stream[K-1]);
cudaMemcpyAsync(,,,cudaMemcpyDeviceToHost,stream[i]);
}

groupId++

}
当我使用两个流时,会有一些重叠,而当我增加流的数量时,不会有重叠,如下图所示。

请解释为什么D2H数据传输没有完全重叠。 此外,在四个流的情况下,每个流的内核由16个线程块调用,每个线程块大小为128个线程。从概念上讲,当GPU上有足够的资源可用时,应该在SM上同时执行两个流。然而,在不同流的内核执行中没有并发性图2。在这种情况下没有并发的原因是什么?

您的64字节传输太短,无法与任何内容重叠-在PCIe 2.0全速约6GB/s时,实际传输大约需要10纳秒。在屏幕截图的比例下,这大约是分析器时间轴上像素宽度的1/1000。钢筋和间隙的有限宽度完全是由于每个转移装置等的开销造成的

您希望传输兆字节的数量级,以便能够与compute重叠传输