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,一经查实,立即删除!

相关文章

泛型 ETKV

文章目录 泛型类泛型方法泛型接口泛型通配符泛型的限定 常见的泛型标识符: E:Element T:Type K:键值对的键 V:键值对的值 不同的泛型,在何时确定为具体? 泛型类 创建对象时,确定具…

Java:SpringBoot中HttpServletRequest对象获取客户端的请求参数

文档 https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html 代码示例 package com.example.demo.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;im…

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

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

【华为OD题库-061】关联子串-java

题目 给定两个字符串str1和str2, str1进行排列组合,只要有一个为str2的子串则认为str1是str2的关联子串,请返回子串在str2的起始位置,若不是关联子串则返回-1。 示例1 输入输出示例仅供调试,后台判题数据一般不包含示例…

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

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

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

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

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

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

Java中synchronized与Lock的区别与使用

Java中synchronized与Lock的区别与使用 当我们谈论Java多线程编程时,线程同步是一个避免资源竞争和保证线程安全的关键概念。在Java中,主要有两种机制来实现线程同步:synchronized关键字和Lock接口。这篇博客将详细介绍这两种同步机制的区别…

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

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

C++构造函数与析构函数介绍

介绍 C中的构造函数和析构函数是类的特殊成员函数,用于初始化和清理对象。 构造函数是在创建对象时自动调用的函数。它的主要目的是初始化对象的状态。构造函数的名称与类的名称相同,并且它不返回任何类型,也没有参数。析构函数与构造函数相…

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…

删除不掉node_modules的办法

全局安装 rimraf 模块到系统下&#xff1a; npm install -g rimraf CD 到相应文件夹&#xff0c;执行如下指令&#xff1a; rimraf node_modules

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

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

pta模拟赛(7-21 求A除以B的商与余数、7-22 一元多项式求导、7-23 一元多项式的乘法与加法运算、7-24 多项式A除以B、7-25 人以群分)

7-21 求A除以B的商与余数 计算A/B的商和余数&#xff0c;其中被除数A是不超过1000位的非负整数&#xff0c;除数B是一个不超过229的任意非负整数。要求你输出商Q和余数R。 输入格式: 输入在一行中依次给出 A 和 B&#xff0c;中间以空格分隔。 输出格式: 在一行中依次输出 Q 和…

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…

深入理解 Go 语言中的接口(interface)

一、GoLang 接口的定义 1、GoLang 中的接口 在 Go 语言中接口&#xff08;interface&#xff09;是一种类型&#xff0c;一种抽象的类型接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范不实现&#xff0c;由具体的对象来实现规范的细节…

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

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

JAVA 可执行文件格式

JAVA 可执行文件格式 springboot 程序使用 Maven PLugin插件编译时&#xff0c;可以生成可执行的 jar 和 war 程序。其核心原理是 spring-boot-loader 模块&#xff0c;详细原理如下 1 嵌套 JARS java 本身不支持任何标准的加载嵌套 jar 的方式&#xff0c;要解决该问题&…