php网站方案,seo需要付费吗,外国网站的风格,网站建设数据库建设CUDA流与异步 基于流的异步的内核启动和数据传输支持以下类型的粗粒度并发#xff1a; 1.重叠主机计算和设备计算#xff1b; 2.重叠主机计算和主机与设备间的数据传输#xff1b; 3.重叠主机与设备间的数据传输和设备计算#xff1b; 4.并发设备计算。 理解一个CUDA程序 1.重叠主机计算和设备计算 2.重叠主机计算和主机与设备间的数据传输 3.重叠主机与设备间的数据传输和设备计算 4.并发设备计算。 理解一个CUDA程序应该从设备和主机两个角度来考虑。从设备的角度来看操作都被发布到默认的流中并且按发布顺序取执行。设备不知道其他被执行的主机操作。从主机的角度来看每个数据传输都是同步的在等待它们完成时将强制空闲主机时间。内核启动是异步的所以无论内核是否完成主机的应用程序几乎都立即恢复执行。这种内核启动的默认异步行为使它可以直接重叠设备和主机计算。 如果要实现重叠主机计算和主机与设备间的数据传输那么就需要显式地创建CUDA流来保证这个传输任务不会阻塞主机而是在CUDA流中异步发布。当执行异步数据传输时使用cudaMemcpyAsync但必须使用固定(或非分页的)主机内存来保证异步执行时的数据一致性。可以使用cudaMallocHost函数或者cudaHostAlloc函数分配固定内存。如果使用pageable页面的话会带来性能下降。 如果要重叠主机与设备间的数据传输和设备计算那么要将这两个任务发布在两个不同的非空流中同时数据传输还是要满足上面的固定内存。如果要在使用空流那么其他流要使用cudaStreamCreateWithFlags来创建非阻塞流。
Pytorch可以通过将主机与设备间的数据传输和设备计算放在两个显式的torch.cuda.stream中完成重叠为了效率请保证主机与设备间的数据传输涉及的主机内存是pinned()的。