【问题标题】:Overlapping transfers and kernel executions in CUDA with two loops在 CUDA 中使用两个循环重叠传输和内核执行
【发布时间】:2020-07-30 06:38:52
【问题描述】:

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

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 传输在最后一次内核执行之后执行。

【问题讨论】:

  • 您正在尝试在流的array 上记录一个事件...另外,您希望 有哪些重叠?仅从您发布的代码中无法弄清楚。

标签: cuda overlap cuda-streams


【解决方案1】:

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

【讨论】:

  • 谢谢!如果流的数量等于循环迭代的数量,是否可能重叠?所以我只在每个流中加入 HtoD 传输、内核执行和 DtoH 传输。
  • 取决于您想要实现什么样的重叠以及如何使用流和同步。您可以阅读这篇文章以更好地了解它的工作原理:devblogs.nvidia.com/how-overlap-data-transfers-cuda-cc
猜你喜欢
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 2012-12-14
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多