CUDA简介——CUDA内存模式

1. 引言

前序博客:

  • CUDA简介——基本概念
  • CUDA简介——编程模式
  • CUDA简介——For循环并行化
  • CUDA简介——Grid和Block内Thread索引

在这里插入图片描述

CUDA内存模式,采用分层设计,是CUDA程序与正常C程序的最大不同之处:

  • Thread-Memory Correspondence
  • Block-Memory Correspondence
  • Grid-Memory Correspondence

总体的CUDA内存模式为:
在这里插入图片描述

  • 1)Registers & Local Memory:声明在Kernel内的常规变量。小空间变量存储于Register中,大空间变量存储于Local Memory中。因Local Memory操作速度慢,应尽量避免使用Local Memory。
  • 2)Shared Memory:允许同一Block内的Threads间相互通信。
  • 3)Constant Memory:用于存储Kernel执行期间不变的数据。会缓存到On-Chip memory中,可大大降低Kernel执行期间Global Memory的通信吞吐量。
  • 4)Global Memory:用于存储与Host交互的数据。

2. Thread-Memory Correspondence

在这里插入图片描述

Thread-Memory Correspondence,即Threads等价为Local Memory (and Registers):

  • 其范围为:对相应Thread是private的,对其它Threads来说是不可访问的。
  • 其生命周期为:Thread。当Thread执行完成,与该Thread相关的任何local memory (and Registers) 都将自动释放。
  • 不过,local memory和registers存在完全不同的性能特性。

3. Block-Memory Correspondence

在这里插入图片描述
Block-Memory Correspondence,即Blocks等价为Shared Memory:

  • 其范围为:同一Block内的每个Thread均可访问。
  • 其生命周期为:Block。当Block执行完成,其shared memory内容都将自动释放。

4. Grid-Memory Correspondence

在这里插入图片描述
Grid-Memory Correspondence,即Grids等价为Global Memory:

  • 其范围为:所有 Grids内的每个Thread均可访问。
  • 其生命周期为:Host代码内的整个main()程序。或可通过在Host代码中手工调用cudaFree(...)来释放。

5. Device内存模式

在这里插入图片描述

  • Host:由CPU及机器内存等组成。
  • Device:由GPU及其DRAM等组成。【Device图上的绿色方格,表示的是一个CUDA core。】

在这里插入图片描述

Device的DRAM中,有:

  • Global Memory物理空间
  • Local Memory物理空间。需注意,此处的Local,并不是指其物理位置;此处的Local是指该内存空间的scope(范围)和 lifetime(生命周期)。

而Device的GPU中,有:

  • Registers物理空间
  • Shared Memory物理空间

Device图上的绿色方格,表示的是一个CUDA core。Device上的CUDA cores组合在一起,成为streaming Multiprocessor(简称为SM)。
Device图上的黄色方格,表示SM。黄色方格组合在一起为CUDA cores集合。

位于SM上的内存,称为:

  • “On-Chip” Device memory。因此,Registers和Shared Memory均对应为 “On-Chip” Device memory。因Registers和Shared Memory均物理存在与GPU的streaming Multiprocessor中。

非SM上的内存,称为::

  • “Off-Chip” Device memory。因其并不存在与GPU之上。对应,Global Memory和Local Memory均为“Off-Chip” Device memory。也即Device上的DRAM为 “Off-Chip” Device memory。

以NVIDIA GPU Geforce Titan 物理布局为例:
在这里插入图片描述

  • 上图蓝色框所示,为Device的DRAM,均为 “Off-Chip” Device memory。
  • 上图绿色框,即为实际的GPU,对应为“On-Chip” Device memory。

理解Blocks如何映射到SM,是设计kernel的基本要求,从而获得优化的GPU计算性能。

5.1 内存速度

不同的内存空间,其带宽和延迟各不相同:
在这里插入图片描述

  • on-chip memory操作速度,要快于off-chip memory。

5.2 Global Memory访问

在这里插入图片描述
在这里插入图片描述

Global Memory访问方式有:

  • cudaMalloc()
  • cudaMemset()
  • cudaMemCopy()
  • cudaFree()

无法避免不使用Global Memory,因必须使用Global Memory空间,来将数据由host传递到device。不过,应尽量减少Global Memory通讯量,因为其速度很慢。

Global Memory的优势在于:

  • 其通常很大。如计算机内存为8GB或16GB,而Titan和Tesla k40,均有6GB的global DRAM。

5.3 Registers and Local Memory

在这里插入图片描述
Kernel中声明的变量,存储于Register中:

  • 对应为On-Chip Device memory。
  • 为最快的内存形式。

太大不适于Register的数组,将存储在Local Memory中:

  • 对应为Off-Chip Device memory。
  • 由编译器控制。
  • “Local”是指范围,而不是位置。此处“Local”,是指相对每个Thread的Local Memory。
    • 每个Thread均有其自己的private local memory和registers,对其它Thread不可访问。
  • 应尽量避免,因Local Memory为最慢的内存形式之一。Registers为最快的内存形式。
    • 因此,设计目标为避免将更多信息存储于local变量中,以免超过register的存储空间。
    • register space为稀缺硬件资源。应更好地规划充分利用。

5.4 Shared Memory

在这里插入图片描述
借助Shared Memory:

  • 支持同一Block内的Threads之间相互通信:
    • 同步方式通信
  • Shared Memory为非常特殊的内存,对实现计算性能和正确性至关重要:
    • Shared Memory处理速度快,仅次于Registers。因其为On-Chip device memory。
    • 支持Block内的Threads相互通信,可将其看成是用户定义的L1 Cache,可用作“scratch-pad(高速暂存存储器)”内存。后续将介绍Shared Memory和L1 Cache关系密切。

在这里插入图片描述

使用__shared___关键字来表示分配的为shared memory:
在这里插入图片描述

5.5 Constant Memory

Constant Memory为Device Memory的特殊区域:

  • 用于存储Kernel执行过程中不变的数据。
  • 对Kernel来说是只读的。
  • Constant Memory为Off-Chip Device Memory。
  • Constant Memory 积极缓存到 On-Chip Memory中。

在这里插入图片描述
Constant Memory的思想在于:

  • GPU没有很大的cache。从而可使用constant memory来实现很简单的cache类型。
  • Constant Memory可以很大,因其实际位于Device DRAM中。所有Threads均可访问Constant Memory,但其为只读内存。
  • 对于需频繁访问,但Kernel执行过程中不变的数据,可使用Constant Memory。
  • Constant Memory是在off-chain DRAM硬件中实现的,但实际其内容会积极缓存到On-Chip Memory中。因此,使用Constant Memory,可大大降低Kernel执行期间Global Memory的通信吞吐量。

参考资料

[1] Intro to CUDA (part 5): Memory Model

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《opencv实用探索·九》中值滤波简单理解

1、引言 均值滤波、方框滤波、高斯滤波,都是线性滤波方式。由于线性滤波的结果是所有像素值的线性组合,因此含有噪声的像素也会被考虑进去,噪声不会被消除,而是以更柔和的方式存在。这时使用非线性滤波效果可能会更好。中值滤波是…

未势能源亮相中国燃料电池汽车大会,助力京津冀“氢能高速”

2023年12月1日,首届中国燃料电池汽车大会在大兴国际氢能示范区举办。大会由北京市经济和信息化局、北京市大兴区人民政府、中国汽车技术研究中心有限公司共同主办。中国科学技术协会主席万钢作主旨报告,国务院国资委副主任苟坪,中国科学院院士…

CO11N报工时,在填入返工数量后自动产生返工工单

本文档主要说明一种返工流程,当工人报工时,填写返工数量、变式原因即可启动触发点自动创建返工订单,被创建的反工订单为无料号生产订单,且关联报工订单。涉及系统功能点包括状态参数 一、 后台配置 1).用户状态参数:BS02(SPRO-生产-商店低价控制-主数据-订单-定义状态…

无公网IP环境固定地址远程SSH访问本地树莓派Raspberry Pi

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…

专业做除甲醛净化器的品牌 甲醛净化器什么牌子最好用

室内产生了超标的甲醛,大部分都会采取选择甲醛空气净化器来去除,甲醛净化器逐渐成为室内清除甲醛的主力,在选择甲醛净化器时,人们常常会被市场上琳琅满目的空气净化器品牌所迷惑,各品牌和型号都声称自己最好&#xff0…

freeRTOS创建任务

一.动态创建任务 1.函数xTaskCreate() BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数const char * const pcName, // 任务的名字const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节void * const pvParameters, // …

CCFCSP试题编号:202006-2试题名称:稀疏向量

不断匹配相乘累加就好了 #include<iostream> #include<vector> #include <utility> using namespace std;int main() {int n;int a, b;long long result0; // 使用 long long cin >> n >> a >> b;vector<pair<int, int> > u…

Python面向对象⑤:多态【侯小啾Python基础领航计划 系列(二十三)】

Python面向对象⑤:多态【侯小啾Python基础领航计划 系列(二十三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

minio服务端搭建使用

一.minio文件服务搭建 非docker环境部署(Linux部署) 1.官网下载安装包&#xff1a;MinIO | Code and downloads to create high performance object storage 2、上传安装包文件到目录(这个可以自由选择) /home/minio/ 3、为minio添加权限 sudo chmod x minio 4、 创建mini…

开关柜无线测温系统

开关柜无线测温系统是一种基于无源无线通信技术的开关柜温度监测系统&#xff0c;依托电易云-智慧电力物联网实现高压开关柜接头温度的在线监测和报警。该系统通过在开关柜内部安装无线温度探测器&#xff0c;实时监测开关柜内部的接头、电缆接头、母排等的温度监控&#xff0c…

0年费、0月费、免kyc,支持ChatGPTPlus充值虚拟卡

虚拟卡通常是指银行卡的虚拟卡&#xff0c;是在银行卡的基础上的银联、VISA、万事达卡BIN码衍生出的一种虚拟账户。虚拟卡一般都是用于网络上无卡支付&#xff0c;因此虚拟卡都不会配备相应的实体卡片。银行卡的虚拟卡&#xff0c;在分类上与实体卡并无什么区别&#xff0c;也分…

学SQL JOINS看这一篇文章就够了

目录 下面以实例进行分析 内连接 inner join 或者join&#xff08;等同于inner join&#xff09; 外连接 left join 或者left outer join(等同于left join) [ left join 或者left outer join(等同于left join) ] [ where B.column is null ] right join 或者right outer…

Docker Registry本地镜像仓库部署并实现远程连接拉取镜像

Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…

Centos系列:shell编程综合练习(个人学习记录)

shell编程综合练习&#xff08;个人学习记录&#xff09; shell编程until 循环跳出循环1. break命令2. continue 命令 Shell函数特殊变量输入输出重定向输出重定向输入重定向重定向 Shell实战监控centos7运行状态/proc/stat文件编写脚本free命令监控系统内存 shell编程 until …

h5网站开发-微信浏览器无法自动播放视频的解决方式?

一、需求&#xff1a; 使用h5开发的网站&#xff0c;首页的banner是一个video视频&#xff0c;在PC端上和手机浏览器上都能正常播放&#xff0c;但是在手机微信浏览器里面视频是无法自动播放的。 二、实现效果&#xff1a; 1.微信浏览器的效果&#xff1a; 2.正常效果&…

如何实现高效代码审查,赋能大规模开发

对于许多企业来说&#xff0c;代码审查都是开发过程中不可缺少的一环。软件开发人员通常会对代码审查感到又爱又恨。一般来说&#xff0c;实施代码审查的企业普遍认为通过及早发现问题和低效率&#xff0c;在长远来看可节省时间。 阅读本篇文章&#xff0c;您将了解到什么是代…

JS浮点数精度问题及解决方案

前端面试大全JS浮点数精度问题及解决方案 &#x1f31f;经典真题 &#x1f31f;浮点数精度常见问题 &#x1f31f;为什么会有这样的问题 &#x1f31f;真题解答 &#x1f31f;总结 &#x1f31f;经典真题 为什么 console.log(0.20.10.3) 得到的值为 false &#x1f31f;…

vs-code之vue3插件

1.Vue 3 Support - All In One Vue3 代码片段突出显示了 Visual Studio Code 的格式化程序生成器 生成vue3对应的的代码 如ref等&#xff0c; 2.Volar 相信使用 VSCode 开发 Vue2 的同学一定对 Vetur 插件不会陌生&#xff0c;作为 Vue2 配套的 VSCode 插件&#xff0c;它的主…

C++学习之路(十)C++ 用Qt5实现一个工具箱(增加一个时间戳转换功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《JSON数据格式化》功能&#xff0c;还是比较实用的。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加一个平时经常用到的功能吧&#xff0c;就是「 时间戳转换 」功能&#xff0c;而且实现点击按钮后文字进行变…

Unity中C#如何访问并修改Shader材质

文章目录 前言一、我们用点击按钮来改变Shader传入的颜色值1、在渲染GUI时&#xff0c;绘制一个按钮2、我们使用一个公共的成员变量存储需要进行修改的游戏对象3、最后给绘制的按钮点击增加逻辑即可 二、测试使用的代码1、Shader代码&#xff1a;2、C#脚本 前言 我们写好Shade…