title: 【CUDA 基础】3.6 动态并行

categories:

- CUDA

- Freshman

tags:

- 动态并行

- 嵌套执行

- 隐式同步

toc: true

date: 2018-04-24 20:57:48



Abstract: 本文介绍CUDA动态并行——在设备上运行时的网格启动新的子网格

Keywords: 动态并行,嵌套执行

动态并行

本文作为第三章CUDA执行模型的最后一篇介绍动态并行,书中关于动态并行有一部分嵌套归约的例子,但是我认为,这个例子应该对我们用途不大,首先它并不能降低代码复杂度,其次,其运行效率也没有提高,动态并行,相当于串行编程的中的递归调用,递归调用如果能转换成迭代循环,一般为了效率的时候是要转换成循环的,只有当效率不是那么重要,而更注重代码的简洁性的时候,我们才会使用,所以我们本文只介绍简单的一些基础知识,如果需要使用动态并行相关内容的同学,请查询文档或更专业的博客。

到目前为止,我们所有的内核都是在主机线程中调用的,那么我们肯定会想,是否我们可以在内核中调用内核,这个内核可以是别的内核,也可以是自己,那么我们就需要动态并行了,这个功能在早期的设备上是不支持的。

动态并行的好处之一就是能让复杂的内核变得有层次,坏处就是写出来的程序更复杂,因为并行行为本来就不好控制,去年我在没有系统的学习CUDA的时候写过一个400行左右的内核,用来训练人脸检测程序,确实比cpu块,但是从gpu的温度来判断,并没有很高的利用率(当时还不会使用性能检测工具这些,当时TensorFlow跑的时候GPU温度有80多,但是我写的就只有60多,所以我断定,gpu性能完全没发挥,但是那个程序还是运行了好久,可见磨刀不误砍柴工这句话是多么正确)

动态并行的另一个好处是等到执行的时候再配置创建多少个网格,多少个块,这样就可以动态的利用GPU硬件调度器和加载平衡器了,通过动态调整,来适应负载。并且在内核中启动内核可以减少一部分数据传输消耗。

嵌套执行

前面我们大费周章的其实也就只学了,网格,块,和启动配置,以及一些线程束的知识,现在我们要做的是从内核中启动内核。

内核中启动内核,和cpu并行中有一个相似的概念,就是父线程和子线程。子线程由父线程启动,但是到了GPU,这类名词相对多了些,比如父网格,父线程块,父线程,对应的子网格,子线程块,子线程。子网格被父线程启动,且必须在对应的父线程,父线程块,父网格结束之前结束。所有的子网格结束后,父线程,父线程块,父网格才会结束。

上图清晰地表明了父网格和子网格的使用情况,一种典型的执行方式:

主机启动一个网格(也就是一个内核)-> 此网格(父网格)在执行的过程中启动新的网格(子网格们)->所有子网格们都运行结束后-> 父网格才能结束,否则要等待

如果调用的线程没有显示同步启动子网格,那么运行时保证,父网格和子网格隐式同步。

图中显式的同步了父网格和子网格,通过设置栅栏的方法。

父网格中的不同线程启动的不同子网格,这些子网格拥有相同的父线程块,他们之间是可以同步的。线程块中所有的线程创建的所有子网格完成之后,线程块执行才会完成。如果块中的所有线程在子网格完成前退出,那么子网格隐式同步会被触发。隐式同步就是虽然没用同步指令,但是父线程块中虽然所有线程都执行完毕,但是依旧要等待对应的所有子网格执行完毕,然后才能退出。

前面我们讲过隐式同步,比如cudaMemcpy就能起到隐式同步的作用,但是主机内启动的网格,如果没有显式同步,也没有隐式同步指令,那么cpu线程很有可能就真的退出了,而你的gpu程序可能还在运行,这样就非常尴尬了。父线程块启动子网格需要显示的同步,也就是说不通的线程束需要都执行到子网格调用那一句,这个线程块内的所有子网格才能依据所在线程束的执行,一次执行。

接着是最头疼的内存,内存竞争对于普通并行就很麻烦了,现在对于动态并行,更麻烦,主要的有下面几点:

  1. 父网格和子网格共享相同的全局和常量内存。
  2. 父网格子网格有不同的局部内存
  3. 有了子网格和父网格间的弱一致性作为保证,父网格和子网格可以对全局内存并发存取。
  4. 有两个时刻父网格和子网格所见内存一致:子网格启动的时候,子网格结束的时候
  5. 共享内存和局部内存分别对于线程块和线程来说是私有的
  6. 局部内存对线程私有,对外不可见。

在GPU上嵌套Hello World

完整内容参考https://face2ai.com/CUDA-F-3-6-动态并行/

【CUDA 基础】3.6 动态并行的更多相关文章

  1. 【CUDA 基础】2.3 组织并行线程

    title: [CUDA 基础]2.3 组织并行线程 categories: CUDA Freshman tags: Thread Block Grid toc: true date: 2018-03 ...

  2. CUDA基础介绍

    一.GPU简介 1985年8月20日ATi公司成立,同年10月ATi使用ASIC技术开发出了第一款图形芯片和图形卡,1992年4月ATi发布了Mach32图形卡集成了图形加速功能,1998年4月ATi ...

  3. 【CUDA 基础】5.2 共享内存的数据布局

    title: [CUDA 基础]5.2 共享内存的数据布局 categories: - CUDA - Freshman tags: - 行主序 - 列主序 toc: true date: 2018-0 ...

  4. 【CUDA 基础】6.1 流和事件概述

    title: [CUDA 基础]6.1 流和事件概述 categories: - CUDA - Freshman tags: - 流 - 事件 toc: true date: 2018-06-10 2 ...

  5. 【CUDA 基础】6.0 流和并发

    title: [CUDA 基础]6.0 流和并发 categories: - CUDA - Freshman tags: - 流 - 事件 - 网格级并行 - 同步机制 - NVVP toc: tru ...

  6. 【CUDA 基础】5.3 减少全局内存访问

    title: [CUDA 基础]5.3 减少全局内存访问 categories: - CUDA - Freshman tags: - 共享内存 - 归约 toc: true date: 2018-06 ...

  7. 【CUDA 基础】4.4 核函数可达到的带宽

    title: [CUDA 基础]4.4 核函数可达到的带宽 categories: - CUDA - Freshman tags: - 带宽 - 吞吐量 - 矩阵转置 toc: true date: ...

  8. 【CUDA 基础】4.1 内存模型概述

    title: [CUDA 基础]4.1 内存模型概述 categories: - CUDA - Freshman tags: - CUDA内存模型 - CUDA内存层次结构 - 寄存器 - 共享内存 ...

  9. 【CUDA 基础】3.4 避免分支分化

    - title: [CUDA 基础]3.4 避免分支分化 categories: - CUDA - Freshman tags: - 规约问题 - 分支分化 toc: true date: 2018- ...

随机推荐

  1. C/S软件方案

    互联网时代客户端软件的一些方案 纯Native开发, C++/C#/duilib+C++(Windows), Objective-c(Mac) Qt(Windows/Mac) NW.js/Electr ...

  2. Cannot call sendRedirect() after the response has been committed的解决办法

    做一个Login Demo的时候,写了如下代码: protected void doPost(HttpServletRequest request, HttpServletResponse respo ...

  3. Parallel的使用

    Action<int, int> ReportProcess //返回数据,刷新进度 Exception exception = null; object objLock = new ob ...

  4. HTTP请求管道事件BeginRequest和EndRequest

    这是一个测试示例,代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; ...

  5. 汉明码(hamming code)

    hamming code用于磁盘RAID 2中, 关于汉明码的讲解可以看这篇博文,介绍的很详细.最重要是最后的结论: 汉明码属于分组奇偶校验,P4P2P1=000,说明接收方生成的校验位和收到的校验位 ...

  6. VLC播放各种源

    RTSP    rtsp://admin:Shws1610@192.168.1.33:554/channel/01 UDP 播放推导本机上的udp流 : udp://@:1234 播放其他机器上的ud ...

  7. img 图像底部留白的原因以及解决方法

    有时候,我们在添加图片img标签后并没有给该标签设置magrin属性的margin-bottom值,在有些浏览器中打开就会出现图像底部留白,为什么为造成这个原因?下面就来进行分析:由于img元素默认为 ...

  8. 解决docker pull 速度慢问题

    解决docker pull 速度慢问题 将docker镜像源修改为国内的: 在 /etc/docker/daemon.json 文件中添加以下参数(没有该文件则新建): { "registr ...

  9. js扩展Date对象的方法,格式化日期格式(prototype)

    扩展:Date.prototype.format = function(format){     var o =  {     "M+" : this.getMonth()+1, ...

  10. iptables防火墙操作-查看、配置、重启、关闭

    查看iptables端口配置 iptables -L -n --line-number iptables端口配置(不开通3389无法远程连接,不开通icmp无法ping) iptables -A IN ...