显式同步和逻辑GPU活动:
请注意,即使内核在上述示例中快速运行并在CPU触及y之前完成,也需要显式同步。 Unified Memory使用逻辑活动来确定GPU是否空闲。 这与CUDA编程模型保持一致,该模型指定内核可以在启动后随时运行,并且不能保证在主机发出同步调用之前完成。
逻辑上保证GPU完成其工作的任何函数调用都是有效的。 这包括cudaDeviceSynchronize(); cudaStreamSynchronize()和cudaStreamQuery()(只要它返回cudaSuccess而不是cudaErrorNotReady)指定的流是仍然在GPU上执行的唯一流; cudaEventSynchronize()和cudaEventQuery()在指定事件没有被任何设备工作跟踪的情况下; 以及被记录为与主机完全同步的cudaMemcpy()和cudaMemset()的用法。
在流之间创建的依赖关系将通过同步流或事件来推断其他流的完成。 可以通过cudaStreamWaitEvent()创建依赖关系,或者在使用默认(NULL)流时隐式创建依赖关系。
如果没有其他可能正在访问托管数据的流在GPU上处于活动状态,则CPU从流回调中访问托管数据是合法的。 另外,任何设备工作都没有遵循的回调可以用于同步:例如,通过在回调中发信号通知条件变量; 否则,CPU访问仅在回调期间有效。
有几点值得注意:

  • 在GPU处于活动状态时,CPU始终允许访问非管理的零拷贝数据。
  • GPU在运行任何内核时都被认为是活动的,即使该内核不使用托管数据。 如果内核可能使用数据,则禁止访问,除非设备属性concurrentManagedAccess为1。
  • 除了那些适用于非管理内存的多GPU访问的内存之外,托管内存的并发GPU间访问没有限制。
  • 并发GPU内核访问托管数据没有限制。

注意最后一点如何允许GPU内核之间的竞争(race),就像目前非管理GPU内存的情况一样。 如前所述,从GPU的角度来看,托管内存的功能与非托管内存相同。 以下代码示例说明了这些要点:

int main() {cudaStream_t stream1, stream2;cudaStreamCreate(&stream1);cudaStreamCreate(&stream2);int *non_managed, *managed, *also_managed;cudaMallocHost(&non_managed, 4); // Non-managed, CPU-accessible memorycudaMallocManaged(&managed, 4);cudaMallocManaged(&also_managed, 4);// Point 1: CPU can access non-managed data.kernel << < 1, 1, 0, stream1 >> >(managed);*non_managed = 1;// Point 2: CPU cannot access any managed data while GPU is busy,// unless concurrentManagedAccess = 1// Note we have not yet synchronized, so "kernel" is still active.*also_managed = 2; // Will issue segmentation fault// Point 3: Concurrent GPU kernels can access the same data.kernel << < 1, 1, 0, stream2 >> >(managed);// Point 4: Multi-GPU concurrent access is also permitted.cudaSetDevice(1);kernel << < 1, 1 >> >(managed);return 0;
}

使用流管理数据可视性和并行CPU + GPU访问:
到目前为止,假设对于6.x之前的SM体系结构:1)任何活动内核都可以使用任何托管内存,以及2)在内核处于活动状态时使用来自CPU的托管内存无效。 在这里,我们提出了一个更好的粒度控制管理内存的系统,该系统设计用于支持托管内存的所有设备,包括concurrentManagedAccess等于0的早期体系结构。
CUDA编程模型提供流作为程序机制来指示内核启动之间的依赖性和独立性。 启动到同一个流中的内核保证连续执行,而启动到不同流中的内核可以同时执行。 流描述了工作项目之间的独立性,因此可以通过并发来提高效率。
统一内存通过允许CUDA程序将托管分配与CUDA流明确关联,建立在流独立模型上。 通过这种方式,程序员根据内核是否被启动到指定的流中来指示内核使用数据。 这使基于特定程序数据访问模式的并发机会成为可能。 控制这种行为的功能是:

cudaError_t cudaStreamAttachMemAsync(cudaStream_t stream,void *ptr,size_t length = 0,unsigned int flags = 0);

cudaStreamAttachMemAsync()函数将从ptr开始的内存的长度字节与指定的流相关联。 (目前,长度必须始终为0,表示应该连接整个区域)。由于这种关联,只要流中的所有操作都已完成,统一内存系统就允许CPU访问此内存区域,无论其他流 活跃。 实际上,这限制了活动GPU对托管内存区域的独占所有权,以限制每个流的活动而不是整个GPU的活动。
最重要的是,如果分配不与特定的流相关联,则对所有正在运行的内核都可见,而不管它们的流如何。 这是cudaMallocManaged()分配或__managed__变量的默认可见性; 因此,在任何内核运行时,CPU可能不会触及数据的简单规则。
通过将分配与特定的流相关联,该程序保证只有启动到该流中的内核才会触及该数据。 统一内存系统不执行错误检查:程序员有责任确保担保得到履行。
除了允许更高的并发性之外,使用cudaStreamAttachMemAsync()可以(并且通常会)在统一内存系统内启用数据传输优化,这可能会影响延迟和其他开销。

CUDA学习(九十七)相关推荐

  1. CUDA学习(九):共享内存

    博主CUDA学习系列汇总传送门(持续更新):编程语言|CUDA入门 转自 CUDA学习笔记(6) 共享内存与全局内存   共享内存(Shared memory)是位于每个流处理器组(SM)中的高速内存 ...

  2. Cuda学习笔记(一)——sm流处理器簇对blocks的调度策略

    由于GPU目前在各行各业的广泛应用,无论是深度学习.大数据.云计算等都离不开GPU的并行加速,前阵子自学了Cuda-c编程,希望将来的研究工作能够用得上. Cuda系列总共有4篇,这里主要用于记录本人 ...

  3. 九十七、轻松搞定Python中的PDF办公自动化系列

    @Author:Runsen @Date:2020/7/15 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  4. CUDA学习:GPU硬件连接模型

    CUDA学习:GPU硬件连接模型 一.基本的CPU与GPU连接模型 CPU与GPU之间的连接是通过PCI-Express总线进行连接的.GPU不是一个独立运行的平台而是CPU的协处理器.因此,GPU必 ...

  5. 美学心得(第一百九十七集) 罗国正

    美学心得(第一百九十七集) 罗国正 (2019年2月) 2681.马斯洛提出的最高境界是"自我实现",换一个角度来理解.表述,即"自渡":而优秀的公益人物,他们 ...

  6. OC 获取view相对位置_电脑DIY 篇九十七:万元内预算上30显卡,10700散片配耕升RTX3070炫光OC显卡装机推荐_搜狐汽车...

    电脑DIY 篇九十七:万元内预算上30显卡,10700散片配耕升RTX3070炫光OC显卡装机推荐 2020-10-31 21:40:260点赞1收藏1评论 想攒一台电竞主机.家用主机.酷炫主机无从下 ...

  7. CUDA学习----sp, sm, thread, block, grid, warp概念

    CUDA学习----sp, sm, thread, block, grid, warp概念 2017-01-11 17:14:28|  分类: HPC&CUDA优化 |  标签:cuda  g ...

  8. CUDA学习笔记之 CUDA存储器模型

    CUDA学习笔记之 CUDA存储器模型 标签: cuda存储bindingcache编程api 2010-12-14 01:33 1223人阅读 评论(0) 收藏 举报 分类: CUDA(26) GP ...

  9. CUDA学习笔记之程序优化

    CUDA学习笔记之程序优化 标签: cuda优化conflict存储算法数学计算 2010-01-05 17:18 5035人阅读 评论(4) 收藏 举报 分类: CUDA(6) 版权声明:本文为博主 ...

  10. OpenCV与图像处理学习九——连通区域分析算法(含代码)

    OpenCV与图像处理学习九--连通区域分析算法(含代码) 一.连通区域概要 二.Two-Pass算法 三.代码实现 一.连通区域概要 连通区域(Connected Component)一般是指图像中 ...

最新文章

  1. 怎么确定迭代器后面还有至少两个值_JS Lazy evaluation:可迭代对象与迭代器
  2. 20145221 《信息安全系统设计基础》第3周学习总结
  3. 二 DeepinV20版本安装
  4. 浅析Kubernetes Pod重启策略和健康检查
  5. 华为息屏显示鸿蒙系统动画,华为EMUI 11升级息屏UI和动画!升级点很像小米MIUI 12...
  6. 如何计算CRC循环校验码示例
  7. dnf无限卡连接服务器,不用进DNF游戏也能修改所在频道方法 卡频福音
  8. 软件测试中期答辩,中期答辩材料创新张颖
  9. java模板beetl引擎,Beetl java模板引擎
  10. 使用给定的整数n,编写一个程序生成一个包含(i, i*i)的字典,该字典包含1到n之间的整数(两者都包含)。假设向程序输入:5则输出为:{1:1, 2:4, 3:9, 4:16, 5:25}
  11. GPIO output level 和 GPIO Pull-up/Pull-down的区别
  12. 常用类/ID命名举例
  13. android 调用原生分享功能,调用Android 系统自带分享功能
  14. 计算机内存分配、管理
  15. asp.net是什么?
  16. 聊一聊最近比较火的多云管理平台
  17. frameset和frame的使用方法
  18. AppStore跳转链接
  19. Java实现10万+并发去重,持续优化!(至尊典藏版)
  20. 实时车道线检测和智能告警 | 车距 + 弯道 + 车道线

热门文章

  1. 经典算法面试题目-翻转一个C风格的字符串(1.2)
  2. 2014年前端开发者如何提升自己
  3. CSU 1115: 最短的名字(字典树)
  4. Android Layout XML属性
  5. 韩国遭 Lazarus Group 供应链攻击
  6. SSH远程执行命令环境变量问题
  7. 每日一拍:linux升级python2.x到python3.x
  8. 面向对象程序设计的4个主要特点
  9. iOS tableview嵌套collectionview
  10. ElasticSearch 集群监控