cuda 核函数 for循环_【CUDA 基础】4.4 核函数可达到的带宽
![](/assets/blank.gif)
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 核函数可达到的带宽相关推荐
- cuda 核函数 for循环_【CUDA 基础】6.2 并发内核执行
Abstract: 本文介绍内核的并发执行,以及相关的知识Keywords: 流,事件,深度优先,广度优先,硬件工作队列,默认流阻塞行为 开篇废话 没有废话,继续前面的内容,上文中我们说到了流,事件和 ...
- java 面试for循环_一个基础的for循环面试题
下面的这段程序主要考察的就是for循环的基础,输出什么?????? 1. public class test { 2. 3. /** 4. * @param args 5. */ 6. public ...
- python循环套循环_零基础学python 14 循环套循环:循环的嵌套
大家可以回忆一下,之前我们学习过的循环结构.也就是for循环结构,今后我们还将学习另一种循环结构while结构,这里先不细讲.当初我们学习for循环结构的时候,有心的同学或许会发现,我们的for结构一 ...
- jquery for循环_前端基础入门五(掌握jQuery的常用api,实现动态效果)
jQuery基本概念 学习目标:学会如何使用jQuery,掌握jQuery的常用api,能够使用jQuery实现常见的效果. 为什么要学习jQuery? [01-让div显示与设置内容.html] 使 ...
- for循环多次调用cuda kernel函数_CUDA程序设计入门(二)——核函数
上期内容:SM和SP 原本这期的标题为"任务分解与执行模式".因为该标题覆盖的知识面太广,导致坑很难填,所以我改成了"核函数",本期重点讨论核函数. 这期我们将 ...
- cuda nvcc版本不一致_显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?
在使用深度学习框架的过程中一定会经常碰到这些东西,虽然anaconda有时会帮助我们自动地解决这些设置,但是有些特殊的库却还是需要我们手动配置环境,但是我对标题上的这些名词其实并不十分清楚,所以老是被 ...
- NVIDIA Jetson tx2 cuda和cudnn安装_刷机失败,手动离线安装
问题描述: 在用官方刷机包安装cuda和cudnn是老是出错,故采取以下方式进行安装,能够完美解决该问题. 由于在进行刷机时已经在host(用来刷机的主机)上下载了有关的安装包,故采用离线拷贝安装. ...
- CUDA 编程上手指南:CUDA C 编程及 GPU 基本知识
作者丨科技猛兽 编辑丨极市平台 本文原创首发于极市平台,转载请获得授权并标明出处. 推荐大家关注极市平台公众号,每天都会更新最新的计算机视觉论文解读.综述盘点.调参攻略.面试经验等干货~ 目录 1 C ...
- CUDA编程第三章: CUDA执行模型
前言: 本章内容: 通过配置文件驱动的方法优化内核 理解线程束执行的本质 增大GPU的并行性 掌握网格和线程块的启发式配置 学习多种CUDA的性能指标和事件 了解动态并行与嵌套执行 通过上一章的练习, ...
最新文章
- 一些很特别的J2ME开源项目
- Kubernetes攻略之新手上路
- 数据库基础知识——MySQL服务的启动和停止
- html5 drawimage参数,HTML canvas
- 错误与异常_2-7选择题
- 解决办法:java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_eye(III)J
- 双线adsl负载均衡配置过程
- nsight linux,如何在Linux中用NVIDIA Nsight剖析PyCUDA代码?
- Java菜鸟教程 递归算法与Scanner类
- java使用fast报表控件_FastReport报表控件的使用
- 脑电时频分析-短时傅里叶变换
- 【现已失效】【转载】QQ空间一键点赞方法
- oracle连接超时是什么意思,oracle连接超时自动断开问题
- 帆软报表(FineReport)版本9打开版本10的报表
- pytorch开发工具
- 中国不可能有金融危机而只有经济危机
- Accurate, Dense, and Robust Multi-View Stereopsis论文分析与代码实现(一)
- 去哪儿 爬虫 pre
- 详细设计(流程图、盒图、判定表、判定树)
- AT24C02 误区
热门文章
- 提交文件至服务器的设置——表单属性中的 enctype
- 不使用session,借助redis实现验证码
- AC_Dream 1211 Reactor Cooling
- python如何删除对象属性_如何优雅的删除对象中的指定属性?
- Python、C++ lambda 表达式
- java安全(二):JDBC|sql注入|预编译
- PHP红黑源码,红黑树的实现源码(第二次修订版)
- java 修改最大nio连接数_关于java流的几个概念:IO、BIO、NIO、AIO,有几个人全知道?...
- 儿童吹泡泡水简单配方_儿童吹泡泡玩具水怎么制作
- MIP 2016年终总结