具有两个循环的CUDA中的重叠传输和内核执行
我希望以如下形式重叠数据传输和内核执行:具有两个循环的CUDA中的重叠传输和内核执行,cuda,overlap,cuda-streams,Cuda,Overlap,Cuda Streams,我希望以如下形式重叠数据传输和内核执行: int numStreams = 3; int size = 10; for(int i = 0; i < size; i++) { cuMemcpyHtoDAsync( _bufferIn1, _host_memoryIn1 ), _size * sizeof(T), cuda
int numStreams = 3;
int size = 10;
for(int i = 0; i < size; i++) {
cuMemcpyHtoDAsync( _bufferIn1,
_host_memoryIn1 ),
_size * sizeof(T),
cuda_stream[i % numStreams]);
cuMemcpyHtoDAsync( _bufferIn2,
_host_memoryIn2,
_size * sizeof(T),
cuda_stream[i % numStreams]);
cuLaunchKernel( _kernel,
gs.x(), gs.y(), gs.z(),
bs.x(), bs.y(), bs.z(),
_memory_size,
cuda_stream[i % numStreams],
_kernel_arguments,
0
);
cuEventRecord(event[i], cuda_stream);
}
for(int i = 0; i < size; i++) {
cuEventSynchronize(events[i]);
cuMemcpyDtoHAsync( _host_memoryOut,
_bufferOut,
_size * sizeof(T),
cuda_stream[i % numStreams]);
}
int numStreams=3;
int size=10;
对于(int i=0;i
在这种情况下是否可能重叠?目前只有HtoD传输与内核执行重叠。第一次DtoH传输在最后一次内核执行之后执行。只有在不同的流上执行操作时,才可能重叠。相同流中的CUDA操作由主机调用顺序顺序执行,以便在相应流上的所有操作完成后,将执行从设备到最终主机的复制。重叠不会发生,因为最后一个内核和第一个副本都在流0上执行,所以副本必须等待内核完成。由于您在每个循环迭代中都与事件同步,因此尚未调用其他流(流1和流2)上的其他副本 只有在不同的流上执行操作时,才可能重叠。相同流中的CUDA操作由主机调用顺序顺序执行,以便在相应流上的所有操作完成后,将执行从设备到最终主机的复制。重叠不会发生,因为最后一个内核和第一个副本都在流0上执行,所以副本必须等待内核完成。由于您在每个循环迭代中都与事件同步,因此尚未调用其他流(流1和流2)上的其他副本 您正在尝试在一组流上记录事件。。。另外,您希望有什么重叠?仅仅从你发布的代码是不可能看出这一点的。你试图在一系列流上记录一个事件。。。另外,您希望有什么重叠?仅仅从你发布的代码是不可能理解的。谢谢!如果流的数量等于循环迭代的数量,是否可能重叠?因此,我只在每个流中对HtoD传输、内核执行和DtoH传输排队。这取决于您想要实现何种重叠以及如何使用这些流和同步。你可以阅读这篇文章来更好地了解它的工作原理:谢谢!如果流的数量等于循环迭代的数量,是否可能重叠?因此,我只在每个流中对HtoD传输、内核执行和DtoH传输排队。这取决于您想要实现何种重叠以及如何使用这些流和同步。你可以阅读这篇文章,更好地了解它的工作原理: