博主CUDA学习系列汇总传送门(持续更新):编程语言|CUDA入门


转自 CUDA学习笔记(6) 共享内存与全局内存

  共享内存(Shared memory)是位于每个流处理器组(SM)中的高速内存空间,主要作用是存放一个线程块(Block)中所有线程都会频繁访问的数据。流处理器(SP)访问它的速度仅比寄存器(Register)慢,它的速度远比全局显存快。但是他也是相当宝贵的资源,一般只有几十KByte,

  这里以我电脑上的“Quadro K620”为例:

硬件资源 参数
流处理器(SP) 128 * 3 = 384
流处理器组(SM/SMM) 3
全局显存(Global memory) 2048MByte
每个SM中的共享内存(Shared memory) 64KByte
每个SM中的寄存器(Register) 65536个32bit寄存器

  可以看到全局显存(Global memory)的大小比共享显存(Shared memory)大了几个数量级。当然,共享显存的访问速度也一定比全局显存快。再从硬件上看:

  每个流处理器组(SM)都拥有属于自己的共享显存(Shared memory)且大小只有64KByte,而这些流处理器组(SM)都位于同一块芯片上(on the same chip),这块芯片又通过PCB电路连接内存芯片(DRAM)。

  • 流处理器(SP)共享显存(Shared memory)上数据的访问属于片上访问,可以立刻取得数据。
  • 流处理器(SP)内存芯片(DRAM)的访问要通过请求内存控制器等一系列操作,然后才能得到数据。

  为了能够明显的看到共享显存(Shared memory)的速度优势,我们就需要把那些被频繁访问的数据直接放到共享显存(Shared memory)中,这样我们的程序在执行时就可以避免频繁访问全局显存(Global memory),导致时间浪费在数据的传输和访问上。

  举个例子,我们需要统计一张超高清图片或者20Mbyte大小的一维数组中每个数值的个数,也就是做直方图统计,结合前面的原子操作(Atomic functions)可以将计算时间至少减半,当然不同架构的GPU会有不同程度的优化。

*注4:直方图统计用于记录一组数据中的数值分布情况,即每个数值出现了多少次,统计数值的分布。

  方案一:

  1. 统计数值分布的数组直接放在全局显存(Global memory)中,每个线程依次读取全局显存中的待统计数据。
  2. 然后使用原子操作对统计数组(Global)中与源数据中数值所对应的元素执行“++”。

  方案二:

  1. 统计数值分布的数组放在全局显存(Global memory)中,每个线程块拥有一个自己的统计数组(Shared)放在共享显存(Shared memory)中。
  2. 线程块中的每个线程依次读取全局显存中的待统计数据,然后使用原子操作对统计数组(Shared)中与源数据中数值所对应的元素执行“++”。
  3. 对线程块中的线程同步,以保证该线程块中的所有线程都已经完成原子操作。
  4. 将当前线程块中的统计数组(Shared)加到统计数组(Global)中。

  这样,方案二就通过使用共享显存(Shared memory)避免了对全局显存(Global memory)的频繁访问,以达到提高程序运行速度的效果。

  方案一核函数的实现:

结果是:方案而统计10MByte大小数据的直方图使用了7.33毫秒

  这里我使用了两个寄存器“counter_1, counter_2”来保证记录时间的准确性,通过实验,流处理器(SP)访问寄存器的时间只有6个时钟周期(大约6纳秒),而单个线程耗时越3000个时钟周期,有较高的可信度。

  就结果而言,加速比达到了160%160%甚至更多。

  下面补充一个SMM的结构,SMM是SM的改良变种,与SM的功能完全相同。区别在于它的内部将流处理器(SP)以及寄存器(Register)等区域分成了4块,主要目的是获取更大的带宽。

  我认为只要原因是我的“Quadro K620”显卡专门对此做过硬件改良,使用SMM的结构代替原来传统的SM结构,大大增加了带宽。同时也拥有2MByte之大的二级缓存,大大增加了访问全局显存(Global memory)的速度,因此使用共享显存(Shared memory)加速比不如其他游戏型显卡高。这些可以在 参考文献5 中查证。

参考:

1.《CUDA并行程序设计》机械工业出版社

2.NVIDIA官方原子操作说明文档

3.CUDA Toolkit Documation

4.CUDA Toolkit Documation Shared memory篇

5.GM107芯片白皮书 NVIDIA GeForce GTX 750 Ti Whitepaper

CUDA学习(九):共享内存相关推荐

  1. [CUDA学习]5. 常量内存与事件

    常量内存与事件 本文将介绍CUDA C的一些更高级的功能.具体来说,就是通过GPU上特殊的内存区域来加速应用程序的执行.这里将讨论其中的一种内存区域:常量内存(Constant Memory).此外还 ...

  2. 嵌入式linux的学习笔记-共享内存(六)

    共享内存 共享内存是可以被多个进程共享访问的一部分物理内存,如果多个进程都把一个内存区映射到自身的虚拟地址空间,则这些进程就可以直接访问该共享的内存区域,从而通过共享内存的方式实现多进程间的通讯,共享 ...

  3. CUDA总结:共享内存

    共享内存是片上内存(on-chip),所以速度比一般的显存快很多,如(全局内存.常亮内存.纹理内存).共享内存是gpu中,带宽仅次于寄存器的存储器. 共享内存是有限的,与L1 Cache公用一块on- ...

  4. Cuda学习笔记(一)——sm流处理器簇对blocks的调度策略

    由于GPU目前在各行各业的广泛应用,无论是深度学习.大数据.云计算等都离不开GPU的并行加速,前阵子自学了Cuda-c编程,希望将来的研究工作能够用得上. Cuda系列总共有4篇,这里主要用于记录本人 ...

  5. CUDA学习笔记(持续更新——蜗速)

    CUDA学习笔记(持续更新--蜗速) 1.CUDA 程序实现流程如下 2.内存管理 3.核函数 4.全局数据访问唯一索引 5.设备管理 附录代码 1.CUDA 程序实现流程如下 将数据从CPU内存拷贝 ...

  6. Android 匿名共享内存C接口分析

    原址 在Android 匿名共享内存驱动源码分析中详细分析了匿名共享内存在Linux内核空间的实现,虽然内核空间实现了匿名共享内存,但仍然需要在用户空间为用户使用匿名共享内存提供访问接口.Androi ...

  7. CUDA学习第二天: GPU核心与SM核心组件

    1. CUDA的内存模型 每个线程有自己的私有本地内存(local memory) , 每个线快有包含共享内存, 可以被线程块中所有线程共享,其声明周期与线程块一致. 此外,所有的线程都可以访问全局内 ...

  8. CUDA学习(二十九)

    占用率计算器: 有几个API函数可以帮助程序员根据寄存器和共享内存的要求来选择线程块大小: 占用计算器API cudaOccupancyMaxActiveBlocksPerMultiprocessor ...

  9. 访问时发生了共享冲突是什么意思_【CUDA 基础】5.1 CUDA共享内存概述

    Abstract: 本文为CUDA内存的概述,介绍共享内存的模型,分配,访问,配置,同步等内容Keywords: 模型,分配,访问,配置,同步 开篇废话 这里首先要进一步说明一下,前面我们在说缓存的时 ...

最新文章

  1. JGG:COVID-19感染导致儿童上呼吸道和肠道菌群持续失衡
  2. MySQL/MariaDB数据库主从复制
  3. 【Android 逆向】APK 文件处理脚本 ApkTool.py ( 脚本简介 | 用法 | 分析 APK 文件 )
  4. 【每日算法】C语言8大经典排序算法(2)
  5. 【采用】【风险管理】金融业务风控相关框架(宝藏)
  6. 过程或函数的副作用是_Python函数和函数式编程(两万字长文警告!一文彻底搞定函数,建议收藏!)...
  7. gre可以用计算机,GRE数学能用计算器吗
  8. 红橙Darren视频笔记 缓存方案 缓存到数据库(数据库操作) 上
  9. JSON和JSONP (含jQuery实例)(share)
  10. r(AB)=r(B)则方程组ABX=0与Bx=0有完全相同的解
  11. TDL信道模型和CDL信道模型
  12. 计算机控制技术毕业论文题目,计算机控制方面论文选题 计算机控制论文题目怎样定...
  13. 计算机蓝屏代码0x0000007b,解决电脑蓝屏出现代码0x0000007b怎么解决
  14. linux关机suspending,(转)Linux 休眠原理与实现
  15. Debug和release版本区别 原码反码补码的转换及存储
  16. 打印服务spoolsv.exe应用程序错误解决方法
  17. PHP 之道中文简体版
  18. 淘宝小程序调研-部署-开发从零到1
  19. python 福利吧_福利吧自动签到脚本
  20. itertools:Python3迭代库(持续更新ing...)

热门文章

  1. 【SpringCloud】3分钟讲解SpringCloud1.0
  2. google/glog 使用
  3. 圣杯布局双飞翼布局认识
  4. JAVA十进制转化为十六进制
  5. WannaCry病毒肆虐全球,唯有这家网络安全公司融资1亿美金却笑不出来
  6. 这些被夸爆了的绘图软件,哪一款更实用?
  7. 安装Python编译器
  8. 中国管理软件与国外管理软件的差距有多少?
  9. 利用ZABBIX进行服务器自动巡检并导出报表
  10. 智能座舱:屏幕“堆砌”不是全部,“双商”满分才是归宿