博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cudaMemcpy与cudaMemcpyAsync的区别
阅读量:6952 次
发布时间:2019-06-27

本文共 879 字,大约阅读时间需要 2 分钟。

转载请注明来源:

简单可以理解为:cudaMemcpy是同步的,而cudaMemcpyAsync是异步的。具体理解需要弄清以下概念:

1.CUDA Streams

在cuda中一个Stream是由主机代码发布的一系列再设备上执行的操作,必须确保顺序执行。不同streams里面的操作可以交叉执行或者并发执行。

2.默认stream

设备操作包括:数据传输和kernels,在cuda中,所有的设备操作都在stream中执行。当没有指定stream时,使用默认的stream。默认stream是一个针对设备操作同步的stream,也就是说,只有当所有之前设备上任何stream里面的操作全部完成时,才开始默认stream里面操作的执行,并且默认stream里面的一个操作必须完成,其他任何stream里面的操作才能开始。

例如以下代码:

cudaMemcpy(d_a, a, numBytes, cudaMemcpyHostToDevice); increment<<<1,N>>>(d_a) cudaMemcpy(a, d_a, numBytes, cudaMemcpyDeviceToHost);

从设备端来看,这三个操作都在默认stream中,并且按顺序执行;从主机端来看,数据传输是阻塞的或者同步传输,而kernel是异步的。第一步主机到设备的数据传输是同步的,CPU线程不能到达第二行直到主机到设备的数据传输完成。一旦kernel被处理,CPU线程移到第三行,但是改行的传输不能开始,因为设备端正在执行第二行的内容。

3.非默认stream

非默认stream中的数据传输使用函数cudaMemcpyAsync(),这个函数在主机端是非阻塞的,传输处理后控制权马上返回给主机线程

参考:https://devblogs.nvidia.com/parallelforall/how-overlap-data-transfers-cuda-cc/

转载于:https://www.cnblogs.com/shrimp-can/p/5231857.html

你可能感兴趣的文章
“鹅厂”整理的Java测试工具和框架
查看>>
better-fe 前端技术周刊 - 2019/05/06
查看>>
Android初级开发笔记-- activity启动模式的学习(1)
查看>>
ABT 链网是怎样建成的?
查看>>
iOS 注释方法大全 代码块加快捷键注释
查看>>
90后,当你们还在沉迷于玩乐时,00后已经开始学python编程了!
查看>>
react-navigation升级3.x 问题解决方案
查看>>
redis 学与思系列(4)
查看>>
2019.5.6_普通的一天_用户定义的可调用类型
查看>>
Redis基础、高级特性与性能调优
查看>>
使用Nginx反向代理到go-fastdfs
查看>>
【每日推理2019/06/02】
查看>>
android进程保活实践
查看>>
Activity的四种加载模式之生命周期变化(横竖屏切换)
查看>>
Spark性能优化:优化数据结构
查看>>
又是臭重惹得祸!Office 2016大当机遭微软紧急撤除
查看>>
Flutter 入门之 ListTile 使用指南
查看>>
Android Material Design控件使用(一)——ConstraintLayout 约束布局
查看>>
好程序员Web前端分享程序的三大结构(一)
查看>>
Mac下如何编译 FFmpeg的SO库,为Android使用
查看>>