0

我想以这样的形式重叠数据传输和内核执行:

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]);
}

在这种情况下可以重叠吗?目前只有 HtoD 传输与内核执行重叠。第一次 DtoH 传输在最后一次内核执行之后执行。

4

1 回答 1

2

只有在不同的流上执行操作时,才可能发生重叠。同一流中的 CUDA 操作由主机调用顺序依次执行,以便在对应流上的所有操作完成后执行从设备到最后主机的复制。重叠不会发生,因为最后一个内核和第一个副本都在流 0 上执行,因此副本必须等待内核完成。由于您在每次循环迭代中与事件同步,因此尚未调用其他流(流 1 和 2)上的其他副本。

于 2020-04-16T22:34:42.947 回答