Abstract: 本文通过矩阵转置这一个例子,调整,优化核函数,使其达到最优的内存带宽Keywords: 带宽,吞吐量,矩阵转置

开篇废话

下面是废话,与本文知识无关,可以直接跳到下面红字处开始本文知识的学习。
废话继续,这两天没更新博客了,上一篇是转发的MIT人工智能实验室的研究指南,也就是告诉刚入学的研究生怎么做研究,要怎么积累,那篇文章发表在1988年,MIT的AI实验室网站目前仍然能检索的到,通读全文,感受很多,也学会了很多东西,当一个健康的框架搭好了以后,后面的好功能会源源不断的涌现,教育也是,当一套体系形成,那么就会有源源不断的人才和成果出现,相反,如果体系本身漏洞百出,根基不稳,短时间真的改不了,人也一样,价值观一旦确定,这个人的人生也就基本定型了——正所谓三岁看老。
今天废话有点多,如果没兴趣,可以直接跳到这里
上一章我们研究怎么通过调整线程网格结构和核函数来达到SM的最高利用率,今天我们来研究如何达到内存带宽的最大利用率。
还是要提那个老例子,但是说实话,这的很形象,也很有用,记住这个例子基本就能了解CUDA的优化大概要从哪入手了:一条大路(内存读取总线)连接了工厂生产车间(GPU)和材料仓库(全局内存),生产车间又有很多的工作小组(SM),材料仓库有很多小库房(内存分块),工作小组同时生产相同的产品互不干扰(并行),我们有车从材料仓库开往工厂车间,什么时候发车,运输什么由工作小组远程电话指挥(内存请求),发车前,从材料仓库装货的时候,还要听从仓库管理员的分配,因为可能同一间库房可能只允许一个车来拿材料(内存块访问阻塞),然后这些车单向的开往工厂,这时候就是交通问题了,如果我们的路是单向(从仓库到工厂)8车道,每秒钟能通过16辆车,那么我们把这个指标称为带宽。当然我们还有一条路是将成品运输到成品仓库,这也是一条路,与原料库互不干扰,和材料仓库到工厂的路一样,也有宽度,也是单向的,如果这条路堵住,和仓库到工厂的路堵住一样,此时工厂要停工等待。最理想的状态是,路上全是车,并且全都高速行驶,工厂里的所有工人都在满负荷工作,没有等待,这就是优化的最终目标,如果这个目标达到了,还想进一步提高效率,那么你就只能优化你的工艺了(算法)
上面的这个就是粗糙的GPU工作过程。例子还是比较贴切的,但是有点描述粗糙,多读两遍应该会有点收获的。
内存延迟是影响核函数的一大关键,内存延迟,也就是从你发起内存请求到数据进入SM的寄存器的整个时间。
内存带宽,也就是SM访问内存的速度,它以单位时间内传输的字节数进行测量。
上一节我们用了两种方法改善内核性能:
- 最大化线程束的数量来隐藏内存延迟,维持更多的正在执行的内存访问达到更好的总线利用率
- 通过适当的对齐和合并访问,提高带宽效率

然而,当前内核本身的内存访问方式就有问题,上面两种优化相当于给一个拖拉机优化空气动力学外观,杯水车薪。
我们本文要做的就是看看这个核函数对应的问题,其极限效率是多少,在理想效率之下,我们来进行优化,我们本文那矩阵转置来进行研究,看看如何把一种看起来没办法优化的内核,重新设计让它达到更好的性能。

内存带宽

完整内容参考 https://face2ai.com/CUDA-F-4-4-核函数可达到的带宽/

cuda 核函数 for循环_【CUDA 基础】4.4 核函数可达到的带宽相关推荐

  1. cuda 核函数 for循环_【CUDA 基础】6.2 并发内核执行

    Abstract: 本文介绍内核的并发执行,以及相关的知识Keywords: 流,事件,深度优先,广度优先,硬件工作队列,默认流阻塞行为 开篇废话 没有废话,继续前面的内容,上文中我们说到了流,事件和 ...

  2. java 面试for循环_一个基础的for循环面试题

    下面的这段程序主要考察的就是for循环的基础,输出什么?????? 1. public class test { 2. 3. /** 4. * @param args 5. */ 6. public ...

  3. python循环套循环_零基础学python 14 循环套循环:循环的嵌套

    大家可以回忆一下,之前我们学习过的循环结构.也就是for循环结构,今后我们还将学习另一种循环结构while结构,这里先不细讲.当初我们学习for循环结构的时候,有心的同学或许会发现,我们的for结构一 ...

  4. jquery for循环_前端基础入门五(掌握jQuery的常用api,实现动态效果)

    jQuery基本概念 学习目标:学会如何使用jQuery,掌握jQuery的常用api,能够使用jQuery实现常见的效果. 为什么要学习jQuery? [01-让div显示与设置内容.html] 使 ...

  5. for循环多次调用cuda kernel函数_CUDA程序设计入门(二)——核函数

    上期内容:SM和SP 原本这期的标题为"任务分解与执行模式".因为该标题覆盖的知识面太广,导致坑很难填,所以我改成了"核函数",本期重点讨论核函数. 这期我们将 ...

  6. cuda nvcc版本不一致_显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?

    在使用深度学习框架的过程中一定会经常碰到这些东西,虽然anaconda有时会帮助我们自动地解决这些设置,但是有些特殊的库却还是需要我们手动配置环境,但是我对标题上的这些名词其实并不十分清楚,所以老是被 ...

  7. NVIDIA Jetson tx2 cuda和cudnn安装_刷机失败,手动离线安装

    问题描述: 在用官方刷机包安装cuda和cudnn是老是出错,故采取以下方式进行安装,能够完美解决该问题. 由于在进行刷机时已经在host(用来刷机的主机)上下载了有关的安装包,故采用离线拷贝安装. ...

  8. CUDA 编程上手指南:CUDA C 编程及 GPU 基本知识

    作者丨科技猛兽 编辑丨极市平台 本文原创首发于极市平台,转载请获得授权并标明出处. 推荐大家关注极市平台公众号,每天都会更新最新的计算机视觉论文解读.综述盘点.调参攻略.面试经验等干货~ 目录 1 C ...

  9. CUDA编程第三章: CUDA执行模型

    前言: 本章内容: 通过配置文件驱动的方法优化内核 理解线程束执行的本质 增大GPU的并行性 掌握网格和线程块的启发式配置 学习多种CUDA的性能指标和事件 了解动态并行与嵌套执行 通过上一章的练习, ...

最新文章

  1. 一些很特别的J2ME开源项目
  2. Kubernetes攻略之新手上路
  3. 数据库基础知识——MySQL服务的启动和停止
  4. html5 drawimage参数,HTML canvas
  5. 错误与异常_2-7选择题
  6. 解决办法:java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_eye(III)J
  7. 双线adsl负载均衡配置过程
  8. nsight linux,如何在Linux中用NVIDIA Nsight剖析PyCUDA代码?
  9. Java菜鸟教程 递归算法与Scanner类
  10. java使用fast报表控件_FastReport报表控件的使用
  11. 脑电时频分析-短时傅里叶变换
  12. 【现已失效】【转载】QQ空间一键点赞方法
  13. oracle连接超时是什么意思,oracle连接超时自动断开问题
  14. 帆软报表(FineReport)版本9打开版本10的报表
  15. pytorch开发工具
  16. 中国不可能有金融危机而只有经济危机
  17. Accurate, Dense, and Robust Multi-View Stereopsis论文分析与代码实现(一)
  18. 去哪儿 爬虫 pre
  19. 详细设计(流程图、盒图、判定表、判定树)
  20. AT24C02 误区

热门文章

  1. 提交文件至服务器的设置——表单属性中的 enctype
  2. 不使用session,借助redis实现验证码
  3. AC_Dream 1211 Reactor Cooling
  4. python如何删除对象属性_如何优雅的删除对象中的指定属性?
  5. Python、C++ lambda 表达式
  6. java安全(二):JDBC|sql注入|预编译
  7. PHP红黑源码,红黑树的实现源码(第二次修订版)
  8. java 修改最大nio连接数_关于java流的几个概念:IO、BIO、NIO、AIO,有几个人全知道?...
  9. 儿童吹泡泡水简单配方_儿童吹泡泡玩具水怎么制作
  10. MIP 2016年终总结