http://blog.csdn.net/OpenHero/article/details/3520578

关于CUDA的global内存访问的问题,怎么是访问的冲突,怎样才能更好的访问内存,达到更高的速度。下面先看几张图,这些图都是CUDA编程手册上的图,然后分别对这些图做解释,来理解硬件1.0,1.1 以及现在最新的硬件的访问内存的区别。

我们在这里再深入的讲解一下global内存对齐的问题,每次执行一条明命令的时候,都是会按照32个thread为一个warp,一起来执行,但是在执行的时候,又会按照硬件的条件(这里有两个限制条件,一个是内存访问的时钟和执行core的时钟不一样,第二个是为了细粒度的分支的问题)然后就会把16个thread组成的half-warp来一次访问global内存才能让访问内存的性能高一些,这个可以理解;

就像手册上说的那样,如果16个thread(half-warp)访问内存的时候,如果每一个thread访问32bits就是4个字节,那么就可以合并为一个64bytes的访问,手册上这点写得有点让人咋一看不太明白~4bytes(32bits)*16 = 64bytes,就是这么来的,如果每一个thread访问64bits(8个bytes),那么就可以合并为128bytes的访问;这里啦,由于合并访问的最大限制是128bytes,所以最大也按照128bytes一次访问来合并,如果超过,就得多次访问,或者如果没有按照这样的方式对齐访问,也会多次访问;下面是1.2device之前的访问的几个图,这里要把1.2device以前和以后的分开,是因为这里在对齐访问的方式的时候,有不同的策略;先看1.2device以前的能合并为一次访问的情况:

下图是编程手册上的图:

这里的每一个thread都是访问的对应的地址,是对齐的,所以可以合并为一个存储event;

下面这个图是没有对齐访问,就造成了non-coalesced访问的问题,下面可以看图说话:

左边的那个好理解,中间对应的thread访问的地址交叉了,thread3和thread4交叉访问了,在硬件1.2版本之前的都会造成Non-Coalesced访问;

详细的需要说明的是右边的为什么也造成了Non-Coalesced(非对齐)访问,这个是基础问题,大家理解的内存对齐是怎么样的?按照固定思路,或者教材上强调的都是中间过程的内存访问的对齐,但是内存是从offset 0x00000000位置开始的,就是偏移量0开始的,如果要真的满足内存对齐,严格的说起来就需要从内存的0地址开始算起,再加上我们知道的global内存的对齐方式有几种,4位bytes,8bytes,16bytes,这里说的对齐方式,注意区别关系;再来看看右边的那个图:thread0开始,从address128的位置开始向下便宜的位置是?132-128=4 偏移了4,16个threads整体访问的是16*4=64,是从132开始的,从0算起来,132-0 =132; 132/16 = 8…4,从整体上讲,从0偏移位置开始,偏移了4个位置,这里的就造成了访问的未对齐,这个是从整体角度上讲的,和左边的图比较一下,那个是按照局部对齐来说的,注意理解;

继续看图说话:

左边的图看看,算一下,局部的时候偏移了,从局部和整体来说,都会引起未对齐访问;

右边的图自己算一下,是不是超出了刚才我说的范围;所以造成了内存访问的未对齐情况;

前面我们看的图都是1.2版本前的硬件的情况下的内存访问情况,现在看看1.2版本以后的硬件;

这里解释一下,什么叫1.2版本的硬件,或许有些朋友也不太了解,g80架构的都是1.0或者1.1的硬件架构,现在的gtx200系列的都是1.3的架构,其实1.2的硬件架构,或许是Nvidia的一个内部的,没有推出产品,可能准备提供给低端的产品,但是我想没有推出低端的产品,直接就上1.3device了,市场需求吧~~如果下一步GTX的架构还是按照老路子,不改进的话,或许Intel的Lrb上来以后,对Nvidia的产品,就是一个很大的竞争了;

不说废话了,先看图:

1.2以后的硬件版本,弱化了threads之间交叉访问的时候,没对齐的情况,只要大家都在一次访问的64bytes的一个段里面,或者128bytes的一个段里面面,这样的段访问,那就可以不用多次访问,当然如果你16个threads分别跨过了16个段,那就得产生16个存储event~记住几个段的定义,这里说的段,就是我们常常理解的对齐的方式,全局的内存访问对齐方式,8个bits的是按照32bytes对齐,16bits的是按照64bytes对齐,32bits和64bits都是按照128bytes对齐;

在优化代码的时候,这个地方是一个值得注意的部分;

API函数里面有对齐访问的接口,会按照对齐的方式分配global内存给你,不过注意其中的一个offset值的使用,这个是为了解决全局情况下的对齐偏移的问题:)cudaMallocPitch,这个函数,注意使用~

CUDA的global内存访问的问题相关推荐

  1. 7. CUDA内存访问(一)提高篇------按部就班 ------GPU的革命

    序言:从上一篇< CUDA编程接口(二)------一十八般武器>到现在,差不多有三个月了,不知道大家在"暑假"里面过得怎么样,又经历了什么?花了两个星期的睡觉前的时间 ...

  2. CUDA Pro:通过向量化内存访问提高性能

    CUDA Pro:通过向量化内存访问提高性能 许多CUDA内核受带宽限制,而新硬件中触发器与带宽的比率不断提高,导致带宽受限制的内核更多.这使得采取措施减轻代码中的带宽瓶颈非常重要.本文将展示如何在C ...

  3. cuda合并访问的要求_【CUDA 基础】4.3 内存访问模式

    Abstract: 本文介绍内存的访问过程,也就是从应用发起请求到硬件实现的完整操作过程,这里是优化内存瓶颈的关键之处,也是CUDA程序优化的基础.Keywords: 内存访问模式,对齐,合并,缓存, ...

  4. 汇编语言学习-寄存器(内存访问)

    内存中字的存储: 两个16进制位是一个字节! 0号单元是低地址单元,1号单元是高地址单元. 0地址单元中存放的字节型数据是多少? 注意区别:"0地址单元"指向的就是:20H 0地址 ...

  5. MM32F3277 MicroPython的 mem 函数对于MCU内存访问

    简 介: 通过mem32,mem16,mem8可以使得MicroPython向访问数字一样访问MCU中的任意内存.在ARM模型下,所有的寄存器都是基于RAM地址访问,所以原则上,可以通过memxx编程 ...

  6. 《操作系统真象还原》——0.7 内存访问为什么要分段

    本节书摘来自异步社区<操作系统真象还原>一书中的第0章,第0.7节,作者:郑钢著,更多章节内容可以访问云栖社区"异步社区"公众号查看 0.7 内存访问为什么要分段 按理 ...

  7. 直接内存访问(DMA)

    1. 什么是DMA 直接内存访问是一种硬件机制,它允许外围设备和主内存之间直接传输它们的I/O数据,而不需要系统处理器的参与.使用这种机制可以大大提高与设备通信的吞吐量.   2. DMA数据传输 有 ...

  8. Java内存访问重排序的研究

    什么是重排序 请先看这样一段代码1 public class PossibleReordering { static int x = 0, y = 0; static int a = 0, b = 0 ...

  9. 寄存器(内存访问)---汇编学习笔记

    寄存器(内存访问) 序言 第二章,我们主要从CPU如何执行指令的角度讲解了8086CPU的逻辑结构.形成物理地址的方法.相关的寄存器以及一些指令. 这一章,我们从访问内存的角度继续学习几个寄存器. 3 ...

最新文章

  1. Mysql,SqlServer,Oracle主键自动增长的设置
  2. AI视频行为分析系统项目复盘——技术篇2:视频流GPU硬解码
  3. UVA 10700 Camel trading
  4. jQuery——stop
  5. RCNN SPP-net Fast-RCNN Faster-RCNN
  6. 【哲学探讨】娱乐至死
  7. python学习-模块和包
  8. ubuntu下制作u盘镜像_deepin下制作win10启动U盘
  9. Linux下DIR,dirent,stat等结构体详解
  10. 电商独立站-谷歌SEO指标
  11. 【JavaScript】详解JSON
  12. bzoj2763:最短路
  13. 解决:Ubuntu18.04配置exoprt LC_ALL=C后无法打开终端
  14. 【NLP】计算所汉语词性标记集
  15. JavaScript(JS) date.getMonth()
  16. 他是学计算机的这个句子中宾语是动词性的,《现代汉语语法修辞》 综合试卷有全部答案...
  17. var foo = function(){} 和 function foo(){}
  18. 关于国外主机PING值
  19. DSAPI多功能.NET函数库组件
  20. 2020-07-08 HTTP协议学习

热门文章

  1. querybuilder 排序_elasticsearch的匹配与排序问题
  2. vlan跨交换机 udp广播_【详解】VLAN和VXLAN有何区别?VXLAN运用场景有哪些?
  3. php如何避免时间重复,如何避免/停止php和html的重复插入?
  4. 解锁一个新技巧,让你舒服到不想起床
  5. 高校教师抄袭豆瓣博主文章,学校证实:基本属实!记过并调离教学科研岗位...
  6. 这个被称为20世纪最伟大人物的最强理科生,到底有多强,你根本不了解
  7. 10分钟让你快速掌握Excel的16项重要技巧
  8. 锁屏快捷键_全面屏 iPhone 锁屏快捷键美化,让你的 iPhone 更特别
  9. python gdb coredump_Linux段错误及GDB Coredump调试方法
  10. phppage类封装分页功能_php显示页码分页类的封装