cuda的shared momery
CUDA SHARED MEMORY
在global Memory部分,数据对齐和连续是很重要的话题,当使用L1的时候,对齐问题可以忽略,但是非连续的获取内存依然会降低性能。依赖于算法本质,某些情况下,非连续访问是不可避免的。使用shared memory是另一种提高性能的方式。
GPU上的memory有两种:
· On-board memory
· On-chip memory
global memory就是一块很大的on-board memory,并且有很高的latency。而shared memory正好相反,是一块很小,低延迟的on-chip memory,比global memory拥有高得多的带宽。我们可以把他当做可编程的cache,其主要作用有:
· An intra-block thread communication channel 线程间交流通道
· A program-managed cache for global memory data可编程cache
· Scratch pad memory for transforming data to improve global memory access patterns
本文主要涉及两个例子作解释:reduction kernel,matrix transpose kernel。
shared memory(SMEM)是GPU的重要组成之一。物理上,每个SM包含一个当前正在执行的block中所有thread共享的低延迟的内存池。SMEM使得同一个block中的thread能够相互合作,重用on-chip数据,并且能够显著减少kernel需要的global memory带宽。由于APP可以直接显式的操作SMEM的内容,所以又被称为可编程缓存。
由于shared memory和L1要比L2和global memory更接近SM,shared memory的延迟比global memory低20到30倍,带宽大约高10倍。
当一个block开始执行时,GPU会分配其一定数量的shared memory,这个shared memory的地址空间会由block中的所有thread 共享。shared memory是划分给SM中驻留的所有block的,也是GPU的稀缺资源。所以,使用越多的shared memory,能够并行的active就越少。
关于Program-Managed Cache:在C语言编程里,循环(loop transformation)一般都使用cache来优化。在循环遍历的时候使用重新排列的迭代顺序可以很好利用cache局部性。在算法层面上,我们需要手动调节循环来达到令人满意的空间局部性,同时还要考虑cache size。cache对于程序员来说是透明的,编译器会处理所有的数据移动,我们没有能力控制cache的行为。shared memory则是一个可编程可操作的cache,程序员可以完全控制其行为。
Shared Memory Allocation
我们可以动态或者静态的分配shared Memory,其声明即可以在kernel内部也可以作为全局变量。
其标识符为:__shared__。
下面这句话静态的声明了一个2D的浮点型数组:
__shared__ float tile[size_y][size_x];
如果在kernel中声明的话,其作用域就是kernel内,否则是对所有kernel有效。如果shared Memory的大小在编译器未知的话,可以使用extern关键字修饰,例如下面声明一个未知大小的1D数组:
extern __shared__ int tile[];
由于其大小在编译器未知,我们需要在每个kernel调用时,动态的分配其shared memory,也就是最开始提及的第三个参数:
kernel<<<grid, block, isize * sizeof(int)>>>(...)
应该注意到,只有1D数组才能这样动态使用。
Memory Banks
为了获得高带宽,shared Memory被分成32(对应warp中的thread)个相等大小的内存块,他们可以被同时访问。不同的CC版本,shared memory以不同的模式映射到不同的块(稍后详解)。如果warp访问shared Memory,对于每个bank只访问不多于一个内存地址,那么只需要一次内存传输就可以了,否则需要多次传输,因此会降低内存带宽的使用。
cuda的shared momery相关推荐
- 详解PyTorch编译并调用自定义CUDA算子的三种方式
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 在上一篇教程中,我们实现了一个自定义的CUDA算子add2,用来实现两个Tensor的相加.然后用Py ...
- CUDA ---- GPU架构(Fermi、Kepler)
GPU架构 SM(Streaming Multiprocessors)是GPU架构中非常重要的部分,GPU硬件的并行性就是由SM决定的. 以Fermi架构为例,其包含以下主要组成部分: CUDA co ...
- CUDA编程——GPU架构,由sp,sm,thread,block,grid,warp说起
目录 1.从硬件看 2.从软件看 3.对应关系 4.SIMT和SIMD 掌握部分硬件知识,有助于程序员编写更好的CUDA程序,提升CUDA程序性能,本文目的是理清sp,sm,thread,block, ...
- 6.CUDA编程手册中文版---附录AB
附录A 支持GPU设备列表 更多精彩内容,请扫描下方二维码或者访问https://developer.nvidia.com/zh-cn/developer-program 来加入NVIDIA开发者计划 ...
- 通过设置PYTORCH_CUDA_ALLOC_CONF中的max_split_size_mb解决Pytorch的显存碎片化导致的CUDA:Out Of Memory问题
问题的出现 最近在基友的带动下开始投身ai绘画的大潮,于是本地部署了stable diffusion web ui,利用手上的24G显存开始了愉快的跑高分辨率图片之旅.然而某天在用inpaint功能修 ...
- CUDA10.1安装 +VS2015开发环境搭建
基本信息 operator system: win10 系统中已经安装了CUDA8,可以同时安装两个版本.再安装CUDA10和仅安装CUDA10一样.在使用的时候选择CUDA10即可. 官网下载软件 ...
- 【网络】UCX(Unified Communication X )|统一抽象通信接口
目录 UCX 的意义 UCX 通信接口简介 支持的传输(协议) UCX社区 UCX 编程模型简介 建立连接 内存注册 异步任务处理(重点) 使用UCX 编译debug版本 构建RPM包 构建DEB 包 ...
- IOS音视频(四十六)离线在线语音识别方案
IOS音视频(四十六)离线在线语音识别方案 IOS音视频(四十六)离线在线语音识别方案 方案一:Siri语音识别 Siri语音识别简介 Siri语音识别功能类介绍 Siri语音识别功能集成 方案二:百 ...
- 【Python-GPU加速】基于Numba的GPU计算加速(一)基本
Numba是一个可以利用GPU/CPU和CUDA 对python函数进行动态编译,大幅提高执行速度的加速工具包. 利用修饰器@jit,@cuda.jit,@vectorize等对函数进行编译 JIT: ...
最新文章
- 【深度学习入门到精通系列】Python批量实现图像镜像翻转
- win7 安装Redis
- AndroidStudio3.4+Unity2018.3,导出JAR包给UNITY使用
- aspnet还有人用吗_别盲目跟风!理性分析:超火的小香风外套真的适合你吗?
- 【洛谷4389】付公主的背包(生成函数,多项式运算)
- 定了!这个专业研究生扩招,博士生待遇要提高!已有多所高校新增…
- Docker 数据持久化的三种方案
- 如何订阅MQTT服务器历史消息,MQTT协议之消息订阅
- python随机生成k个不重复的随机数_使用Python生成不重复的随机值
- linux过滤端口抓包_linux抓包命令tcpdump
- 使用蒙特卡罗模拟期权定价
- 2019111 控制台上实现极乐净土(有图有背景音乐)
- 师范类大学计算机排名,2018中国师范类大学排行榜,北京师范大学第一
- js 解析lrc文件(歌词)
- C语言实现来实现字符串反转,只有单词顺序反转,组成单词的字母不反转
- 一文解析FPGA在数字电源控制器的应用思路
- rocketMq监控平台界面
- 18.06.27 POJ1054 The Troublesome Frog
- #Linux基础(三)
- MC 1.18.2 FORGE 开服教程及自动备份
热门文章
- 预充电电路工作原理_LED触摸调光台灯控制电路板的工作原理
- Nginx的配置实例(反向代理实例 )
- spring elasticsearch 按条件删除_SpringBoot2 高级案例(08):整合 ElasticSearch框架,实现高性能搜索引擎...
- 并发执行变成串行_大神浅谈数据库并发控制 锁和 MVCC
- tsp matlab,五个城市的TSP问题MATLAB程序.doc
- 【学习笔记】第二章——进程的定义、组成、组织方式、特征、状态 转换
- python实时绘图暂停_Python实时绘图
- excel 科学计数法转换成文本完整显示_表格技巧—Excel里身份证号码显示不全的多种解决办法...
- python库路径_如何设置本地python库目录/ PYTHONPATH?
- php 邮件发送是html 没样式_使用python发送邮件