emsp; 我们在GPU的基本概念一节中,讲到过GPU中的内存模型,但那一节只是对模型的简单介绍,这一节,我们对GPU的内存进行更加深入的说明。

  首先来回顾一下GPU中的内存:

  • 每个线程都有自己的私有本地内存(Local Memory)和Resigter
  • 每个线程都包含共享内存(Shared Memory),可以被线程中所有的线程共享,其生命周期与线程快一致
  • 所有的线程都可以访问全局内存(Global Memory)
  • 只读内存块:常量内存(Constant Memory)和纹理内存(Texture Memory)
  • 每个SM有自己的L1 cache,SM通过L2 cache连接到Global Memory

内存访问速度

  这一点跟CPU比较像,就是存储空间越大,访问速度越慢,GPU内存的访问速度从快到慢依次为:Registers->Caches->Shared Memory->Gloabl Memory。

Registers

  寄存器是访问速度最快的空间,寄存器变量在程序中宏如何使用?

  当我们在核函数中不加修饰的声明一个变量,那该变量就是寄存器变量,如果在核函数中定义了常数长度的数组,那也会被分配到Registers中;寄存器变量是每个线程私有的,当这个线程的核函数执行完成后,寄存器变量也就不能访问了。

  寄存器是比较稀缺的资源,空间很小,Fermi架构中每个线程最多63个寄存器,Kepler架构每个线程最多255个寄存器;一个线程中如果使用了比较少的寄存器,那么SM中就会有更多的线程块,GPU并行计算速度也就越快。

  如果一个线程中变量太多,超出了Registers的空间,这时寄存器就会发生溢出,就需要其他内存(Local Memory)来存储,当然程序的运行速度也会降低。

  因此,在程序中,对于那种循环操作的变量,我们可以放到寄存器中;同时要尽量减少寄存器的使用数量,这样线程块的数量才能增多,整个程序的运行速度才能更快。

Local Memory

  Local Memory也是每个线程私有的,在核函数中符合存储在寄存器中但不能进入核函数分配的寄存器空间中的变量将被存储在Local Memory中,Local Memory中可能存放的变量有以下几种:

  • 使用未知索引的本地数组
  • 较大的本地数组或结构体
  • 任何不满足核函数寄存器限定条件的变量

Shared Memory

  每个SM中都有共享内存,使用__shared__关键字(CUDA关键字的下划线一般都是两个)定义,共享内存在核函数中声明,生命周期和线程块一致。

  同样需要注意的是,SM中共享内存使用太多,会导致SM上活跃的线程数量减少,也会影响程序的运行效率。

  数据的共享肯定会导致线程间的竞争,可以通过同步语句来避免内存竞争,同步语句为:

void __syncthreads();

当所有线程都执行到这一步时,才能继续向下执行;频繁调用__syncthreads()也会影响核函数的执行效率。

  共享内存被分成了不同个Bank,我们知道一个Warp中有32个SM,在比较老的GPU中,16个Bank可以同时访问,即一条指令就可以让半个Warp同时访问16个Bank,这种并行访问的效率可以极大的提高GPU的效率。比较新的GPU中,一个Warp即32个SM可以同时访问32个Bank,效率又提升了一倍。

  下面这个图中,左边的图每个线程访问一个Bank,不存在内存冲突,通过一个指令即可完成访问所有的访问操作;右边的图虽然看起来有些乱,但还是一个线程对应一个Bank,也不存在冲突,一个指令即可完成。

  下面这个图中,存在多个Thread访问一个Bank的情况,如果是读操作,那么GPU底层可以通过广播的方式将数据传给各个Thread,延迟不会很大,但如果是写操作,就必须要等上一个线程写完成后才能进行下一个线程的写操作,延时会比较大。

Constant Memroy

  常量内存驻留在设备内存中,每个SM都有专用的常量内存空间,使用__constant__关键字来声明。

  常量内存存在于核函数之外,在全局范围内声明,常量内容的访问速度也是很快的,对所有的核函数都可见,在Host端进行初始化后,核函数不能再修改。

Texture Memory

  纹理内存的使用并不多,它是为了GPU的显示而设计的,这里不多讲了。

Global Memory

  全局内存,就是我们常说的显存,就是GDDR的空间,全局内存中的变量,只要不销毁,生命周期和应用程序是一样的。

  在访问全局内存时,要求是对齐的,也就是一次要读取指定大小(32、64、128)整数倍字节的内存,数据对齐就意味着传输效率降低,比如我们想读33个字节,但实际操作中,需要读取64字节的空间。

GPU缓存

  每个SM都有一个一级缓存,所有SM公用一个二级缓存,GPU读操作是可以使用缓存的,但写操作不能被缓存。

  每个SM有一个只读常量缓存,只读纹理缓存,它们用于设备内存中提高来自于各个内存空间内的读取性能。

微信公众号:Quant_Times

GPU编程3--GPU内存深入了解相关推荐

  1. python的gpu编程_cuda-Python GPU编程

    cuda-Python GPU编程 我目前正在使用python开发一个项目,我想利用GPU进行一些计算. 乍一看,似乎有许多可用的工具. 乍一看,我觉得我错过了一些东西. Copperhead看起来很 ...

  2. 运筹系列59:用python进行GPU编程总结

    1. GPU硬件架构 简单理解,GPU就是很多很多非常弱的cpu在做并行计算.个人桌面电脑CPU只有2到8个CPU核心,GPU却有上千个核心.在英伟达的设计理念里,CPU和主存被称为Host,GPU被 ...

  3. CUDA编程: GPU与CPU之间使用全局统一内存的完整代码及编译

    CUDA编程: GPU与CPU之间使用全局统一内存的完整代码及编译 最近碰到一个应用场景,需要从GPU访问host上创建的,一个很大的布隆过滤器(准确说是改进后的布谷鸟过滤器).由于GPU卡上的显存有 ...

  4. GPU编程和流式多处理器(二)

    GPU编程和流式多处理器(二) 2. 整数支持 SM具有32位整数运算的完整补充. • 加法运算符的可选否定加法 • 乘法与乘法加法 • 整数除法 • 逻辑运算 • 条件码操作 • to/from浮点 ...

  5. GPU编程和流式多处理器

    GPU编程和流式多处理器 流式多处理器(SM)是运行CUDA内核的GPU的一部分.本章重点介绍SM的指令集功能. 流式多处理器(SM)是运行我们的CUDA内核的GPU的一部分.每个SM包含以下内容. ...

  6. 《多核与GPU编程:工具、方法及实践》----1.5 并行程序性能的预测与测量

    本节书摘来自华章出版社<多核与GPU编程:工具.方法及实践>一书中的第1章,第1.5节, 作 者 Multicore and GPU Programming: An Integrated ...

  7. GPU 编程入门到精通(五)之 GPU 程序优化进阶

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GP ...

  8. GPU 编程入门到精通(四)之 GPU 程序优化

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GP ...

  9. GPU 编程入门到精通(三)之 第一个 GPU 程序

    博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

  10. GPU 编程入门到精通(一)之 CUDA 环境安装

    GPU 编程入门到精通(一)之 CUDA 环境安装 标签: cudagpunvidia GPU 编程入门到精通(一)之 CUDA 环境安装 标签: cudagpunvidia 2014-04-11 2 ...

最新文章

  1. 一文看懂Java微服务架构,WEB2.0,垂直架构,分布式架构,微服务架构
  2. Hadoop:HDFS NameNode内存全景
  3. 朗讯项目的一个概括总结.
  4. LInux主机与虚拟机网络链接
  5. SpringBoot中实现CommandLineRunner接口在项目启动后立即执行某方法
  6. [转]使用Ant进行ssh和scp操作
  7. 【解决办法】你目前是以 ***的身份登录。请注销,然后使用你用于阅读组织电子邮件的帐户登录 Outlook
  8. 使用JavaScript实现页面选项自动添加行以及删除行 javaweb
  9. 默认权限umask、文件系统权限、特殊权限
  10. Docker系列(七)构建镜像
  11. pivot 与 unpivot函数
  12. qtreeview 点击二级节点弹出dialog_2019二级造价师开卷考?一顿操作猛如虎,一看分数59...
  13. Atitit.antlr实现词法分析
  14. 学计算机二级的免费软件,计算机二级MS模拟软件
  15. 浅析“儒”、“法”、“道”
  16. python selenium+firefox对网页截长图
  17. 坚果云 我的电脑图标_如何删除“我的坚果云”这个图标?
  18. 华为nova6开启开发者模式,连接USB
  19. 使用Python获取国际版淘宝AliExpress的商品信息
  20. Vue实现图片预览(放大缩小拖拽)纯手写

热门文章

  1. 常见网站挂马方式 网站挂马可利用漏洞 网站加密挂马
  2. Windows键盘鼠标模拟按键类型
  3. cpp-http 库的使用
  4. flutter_interview面试题和答案(2022)
  5. ajax的三种传参方式
  6. 时空大数据面临的挑战与机遇
  7. java俄罗斯方块旋转_java俄罗斯方块旋转算法,求解
  8. 如何做到阿里云 Redis 开发规范中的拒绝 bigkey
  9. 20210107WEB渗透学习之信息收集
  10. 四大里snr是什么职位_四大会计师事务所人员流动性高的原因是什么?