CUDA流与异步

CUDA流与异步

  • 基于流的异步的内核启动和数据传输支持以下类型的粗粒度并发:
    1.重叠主机计算和设备计算;
    2.重叠主机计算和主机与设备间的数据传输;
    3.重叠主机与设备间的数据传输和设备计算;
    4.并发设备计算。

  • 理解一个CUDA程序,应该从设备和主机两个角度来考虑。从设备的角度来看,操作都被发布到默认的流中,并且按发布顺序取执行。设备不知道其他被执行的主机操作。从主机的角度来看,每个数据传输都是同步的,在等待它们完成时,将强制空闲主机时间。内核启动是异步的,所以无论内核是否完成,主机的应用程序几乎都立即恢复执行。这种内核启动的默认异步行为使它可以直接重叠设备和主机计算。

  • 如果要实现重叠主机计算和主机与设备间的数据传输,那么就需要显式地创建CUDA流,来保证这个传输任务不会阻塞主机,而是在CUDA流中异步发布。当执行异步数据传输时,使用cudaMemcpyAsync,但必须使用固定(或非分页的)主机内存来保证异步执行时的数据一致性。可以使用cudaMallocHost函数或者cudaHostAlloc函数分配固定内存。如果使用pageable页面的话会带来性能下降。

  • 如果要重叠主机与设备间的数据传输和设备计算,那么要将这两个任务发布在两个不同的非空流中,同时数据传输还是要满足上面的固定内存。如果要在使用空流,那么其他流要使用cudaStreamCreateWithFlags来创建非阻塞流。

Pytorch可以通过将主机与设备间的数据传输和设备计算放在两个显式的torch.cuda.stream中完成重叠,为了效率请保证主机与设备间的数据传输涉及的主机内存是pinned()的。

相关推荐

  1. CUDA异步

    2024-04-24 00:22:03       35 阅读
  2. C#系列-并行处理+异步(5)

    2024-04-24 00:22:03       50 阅读
  3. CUDA从入门到放弃(七):( Streams)

    2024-04-24 00:22:03       45 阅读
  4. cuda

    2024-04-24 00:22:03       48 阅读
  5. 同步异步

    2024-04-24 00:22:03       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-24 00:22:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-24 00:22:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-24 00:22:03       82 阅读
  4. Python语言-面向对象

    2024-04-24 00:22:03       91 阅读

热门阅读

  1. linux irq:

    2024-04-24 00:22:03       30 阅读
  2. php中常见的正则使用方法

    2024-04-24 00:22:03       32 阅读
  3. Thinkphp命令行创建repository和transform层扩展包

    2024-04-24 00:22:03       35 阅读
  4. 多特征融合的聚类背景下特征选择问题笔记整理

    2024-04-24 00:22:03       37 阅读
  5. 【Git 】常用指令

    2024-04-24 00:22:03       30 阅读
  6. Web集群_01

    2024-04-24 00:22:03       32 阅读
  7. Python实战:文本内容提取

    2024-04-24 00:22:03       36 阅读