【CUDA入门笔记】GPU存储结构模型(1)

news2024/9/25 21:20:37

GPU存储结构模型

 

b4bfef8008cd404d042fdd5c82042450.png

 

1.CPU可以读写GPU设备中的Global Memory、Constant Memory以及Texture Memory内存储的内容;主机代码可以把数据传输到设备上,也可以从设备中读取数据;

2.GPU中的线程使用Register、Shared Memory、Local Memory、Global Memory、Constant Memory以及Texture Memory;不同Memory的作用范围是不同的,和线程、block以及grid有关;

线程可以读写Register、Shared Memory、Local Memory和Global Memory;但是只能读Constant Memory和Texture Memory;

Register

  1. 寄存器,是GPU片上高速缓存, 执行单元可以以极低的延迟访问寄存器。

  2. 寄存器的基本单元式寄存器文件,每个寄存器文件大小为32bit。寄存器变量是每个线程私有的,一旦thread执行结束,寄存器变量就会失效。把寄存器分配给每个线程,而每个线程也只能访问分配给自己的寄存器;

  3. 如果寄存器被消耗完,数据将被存储在局部存储器(本地存储器)中。如果每个线程使用了过多的寄存器,或声明了大型结构体或数据,或者编译器无法确定数据的大小,线程的私有数据就有可能被分配到local memory中,一个线程的输入和中间变量将被保存在寄存器或者是局部存储器中。

  4. 寄存器是GPU最快的memory,kernel中没有什么特殊声明的自动变量都是放在寄存器中,同样,这些变量都是线程私有的。当数组的索引是constant类型且在编译期能被确定的话,就是内置类型,数组也是放在寄存器中。

  5. 寄存器是稀有资源。在Fermi上,每个thread限制最多拥有63个register,Kepler则是255个。让自己的kernel使用较少的register就能够允许更多的block驻留在SM中,也就增加了Occupancy,提升了性能。

Shared Memory

  1. 共享存储器,同寄存器一样,都是片上存储器;存储在片上存储器中的变量可以以高度并行的方式高速访问;把共享存储器分配给线程块,同一个块中的所有线程都可以访问共享存储器中的变量,因为这些变量的存储单元已经分配给这个块;

  2. 共享存储器是一种用于线程协作的高效方式,方法是共享其中的输入数据和其中的中间计算结果;一般情况下,常用共享存储器来保存全局存储器中在kernel函数的执行阶段中需要频繁使用的那部分数据;

Local Memory

    本地存储器,存储位置在于显存上,也就是在局存储器上;
当线程使用的寄存器被占满时,数据将被存储在全局存储器中;
由于局部存储器中的数据被保存在显存中,而不是片上的寄存器或者缓存中,
因此对local memory的访问速度很慢。

Global Memory

    全局存储器,通过动态随机访问存储器(Dynamic Random Access Memory,DRAM)
实现,这里的DRAM就是通常说的显存,是设备独立的存储空间;

GPU上的计算单元在访问全局存储器时有可能出现长延时(几百个时钟周期)和访问带宽有限的情况;在访问全局存储器的路径也经常发生流量拥塞现象,只容许很少的线程(而非所有线程)继续访问,因此导致一些多核流处理器(Streaming Multiprocessor,SM)处于空闲状态;

Constant Memory

    常数存储器,用于存储只读数据,常数变量虽然存在放全局存储器上,
单采用缓存提高了访问效率,用于存储需要频繁访问的只读参数;

Texture Memory

    纹理存储器

设备存储器内变量的作用域和生命周期

  1. CUDA变量由于处于不同的存储器,则有各自不同的作用域和生存期;

  2. 作用域标识了能访问该变量的线程范围:单个线程、块内的所有线程或者网格内所有线程;

  3. 1)作用域为单个线程时,每个线程都会创建一个变量的私有副本放在寄存器中,每个线程只能访问其私有版本的变量;2)作用域为块内所有线程时,每个线程块会创建一个共享变量,由块内线程共享;3)作用域为网格内所有线程时,变量将被存储在全局存储器或者常数存储器中,由kernel生成的所有线程共享;注意,常数存储内的变量由所有网格内的线程共享,常数变量声明位置必须位于任何函数体外;

  4. 生命周期指定在程序的哪一段执行时间内变量是可用的:在kernel函数调用期间或在整个应用程序执行期间中。

  5. 1)寄存器和本地存储器内的变量生命周期在本线程执行期内,线程执行完成后变量内容不在存在;2)共享存储器内的变量声明在kernel函数中,其生命周期是指kernel函数的运行过程,当kernel函数终止执行时,其共享存储器内的变量内容不再存在;3)常数存储器内的变量的生命周期是整个应用的执行过程;

 

b8136f8f81e9adc6a3803a8704de7413.png

 

2. 常用的设备存储API

2.1 操作全局存储器
2.1.1 申请设备内存;
cudaError_t cudaMalloc (void **devPtr, size_t size );
对devPtr内存储的指针分配新的设备内存,size以字节为单位;执行cudaMalloc成功后devPtr内记录的就是分配显存的地址;

下面,分配32个float的设备内存空间 ;

  1. float *d_a;

  2. int nBytes = 32 * sizeof(float);

  3. cudaMalloc((void **)&d_a, nBytes);

2.1.2 释放设备内存
由cudaMalloc申请的内存,由cudaFree释放;

cudaError_t CUDARTAPI cudaFree(void *devPtr);

2.1.3 主机和设备之间的数据拷贝
cudaMemcpy用于在主机(Host)和设备(Device)之间拷贝数据;

cudaError_t cudaMemcpy( void* dst,const void* src,size_t count,enum cudaMemcpyKind kind )
从src指向的存储器区域中将count个字节拷贝到dst指向的存储器区域中,kind决定了数据的拷贝方向;

  1. cudaMemcpyHostToHost

  2. cudaMemcpyHostToDevice: 由主机内存拷贝到设备内存;

  3. cudaMemcpyDeviceToHost: 由设备内存拷贝到主机内存;

  4. cudaMemcpyDeviceToDevice

2.1.4 初始化内存块
使用cudaMemset初始化设备内存的值;

  1. cudaError_t cudaMemset(void* devPtr,int value,size_t count);

  2. 使用固定字节值value来填充devPtr所指向存储器区域的前count个字节;

2.2 操作常数存储器
2.2.1 从主机上拷贝到常数存储器上
使用cudaMemcpyToSymbol将主机存储器的数据复制到GPU;

  1. template<class T>

  2. cudaError_t cudaMemcpyToSymbol( const T& symbol,const void* src,size_t count,size_t offset,enum cudaMemcpyKind kind);

  3. 主机数据拷贝到设备上的symbol处;Symbol可以是位于全局存储器或不变存储器空间内的变量,也可以是一个指定全局存储器或常数存储器空间变量的字符串。kind值是cudaMemcpyHostToDevice或cudaMemcpyDeviceToDevice。

2.2.2 从常数存储器上拷贝到主机上
使用cudaMemcpyFromSymbol将设备上的数据复制到主机上;

  1. template<class T>

  2. cudaError_t cudaMemcpyFromSymbol( void *dst,const T& symbol,size_t count,size_t offset,enum cudaMemcpyKind kind);

从设备上的symbol处拷贝到目标存储器位置dst,拷贝的方向由kind决定,有cudaMemcpyDeviceToHost和 cudaMemcpyDeviceToDevice;

 

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

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

相关文章

信息时代,企业如何安全管理数据

随着企业信息化的发展&#xff0c;企业所产生的数据量也越来越多&#xff0c;企业数据的存储安全和传输安全管理工作则成为企业数据管理者的重中之重。但是对数据的保护要依靠一定的基础设施&#xff0c;目前&#xff0c;世界各国对数据保护的基础设施建设还是不够完善&#xf…

VSCode搭建ruby开发调试环境

安装rvm rvm是ruby版本管理工具&#xff0c;可以管理本地的ruby的版本 curl -sSL https://get.rvm.io | bash -s stable安装ruby 使用 rvm list known获取已知的ruby版本&#xff0c;这里安装3.0.0版本的ruby rvm install 3.0.0新建ruby文件 在VSCode中新建ruby文件main.r…

【强训】Day1

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 组队竞赛2. 删除公共字符答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 下列选项中属于面向对象编程主要特征的是&#xff08;&#xff09; A 继承 B 自顶向下 C 模块化 D 逐步…

【BP靶场portswigger-服务端4】操作系统命令注入-5个实验(全)

目录 一、操作系统命令注入 1、意义 2、有用的命令 3、注入操作系统命令的方式 4、防止操作系统命令注入攻击 二、执行任意命令 1、示例&#xff1a; 实验1&#xff1a;操作系统命令注入&#xff08;简单&#xff09; 三、盲操作系统命令注入漏洞 1、简述 2、示例 3…

Spring Cloud 2022.0.0正式发布:OpenFeign稳得很全面迈向GraalVM

本文已被https://yourbatman.cn收录&#xff1b;女娲Knife-Initializr工程可公开访问啦&#xff1b;程序员专用网盘https://wangpan.yourbatman.cn&#xff1b;技术专栏源代码大本营&#xff1a;https://github.com/yourbatman/tech-column-learning&#xff1b;公号后台回复“…

Vector在CANdb++中关于XCP和应用报文的定义

Vector DBC规则 前文讲解了dbc有关的属性定义与编辑,本文描述在开发过程中关于XCP和应用报文有关的规则说明,方便开发人员正确配置和代码生成所需的属性及其值。 关联文章: dbc的属性定义:dbc的属性定义 Vector DBC属性定义规则:Vector DBC属性定义规则 DBC编辑问题——…

我理解的proc伪文件系统

一.概念 提供可以动态操作Linux内核信息的接口&#xff0c;实现内核空间与用户空间进行数据交换的途径。 二.观察文件内容 //crtlaltt 快速打开Linux终端 //输入一下内容 cd /proc //进入proc文件夹 ls //观察proc文件夹下的内容 cd 2414 //任意打开一个带数字的文件…

【问题解决】解决xshell7会话窗口只能显示一个的问题

这恐怕会成为最短的一篇文章 问题复现 打开多个终端&#xff0c;最终只显示最后一个 如上图&#xff1a; 再打开一个192.168.1.42 &#xff0c;会覆盖掉1.41&#xff0c;终端上先显示最后打开的那个终端。 想要解决xshell7会话窗口只能显示一个的问题&#xff0c;我们只需要…

日志系统:一条SQL更新语句是如何执行的?

前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条更新语句的执行流程又是怎样的呢? 之前你可能经常听 DBA 同事说,…

怎么判定自己的账号有没有被限流?短视频运营推广学习日记

短视频运营推广学习日记 今天开始记录自己的学习过程&#xff0c;今天的内容是&#xff0c;怎么知道自己的账号有没有被限流&#xff1f;对比了几个方法&#xff0c;还是我赢的内容比较正常&#xff0c;限流主要是两种方式&#xff1a;作品限流和账号限流 作品限流&#xff1…

开发第一天

首先下载Binary Editor: https://www.vcraft.jp/soft/bz.html 如图所示&#xff0c;点击下载&#xff1a; 下载后解压&#xff0c;在同一个盘下创建文件夹取名为OSASK,启动Bz.exe程序并输入&#xff1a; 需要复制很多的0,一直到168000这个地址&#xff0c;得到的文件命名为he…

(九) DockerFile

DockerFile一、概述二、DockerFile构建过程2.1、Dockerfile内容基础知识2.2、Docker执行Dockerfile的大致流程2.3、小总结三、DockerFile常用保留字指令四、实操案例4.1、要求Centos7镜像具备vimifconfigjdk84.2、编写4.3、Build构建镜像4.4、虚悬镜像一、概述 Dockerfile是用来…

C++18 -- 虚析构函数构成多态、纯虚函数、抽象类、虚继承

多态的条件&#xff1a; 1&#xff09;覆盖 2&#xff09;基类的指针或者引用 虚表的运行原理&#xff1a; 一、多态的特例 – 虚析构函数构成多态 类有指针作为数据成员&#xff0c;必须要写析构函数&#xff0c;如果当前类被继承了&#xff0c;则析构函数写成virtual&#…

四旋翼无人机学习第19节--allgero的板框导入,网表导入

文章目录1 板框导入2 网表导入3 颜色修改4 修改快捷键1 板框导入 1、板框可以在小马哥课程中获取哦。 课程地址:使用Cadence17.2 OrCAD Allegro绘制小马哥DragonFly四轴飞行器 2、下载得到文件&#xff0c;然后用CAD软件查看DXF文件&#xff0c;出现弹框点击是即可(文件只读)。…

科研小白如何做好科研(内附一些科研实用工具)

目录 前言 一、了解自己的研究方向 1、知其然并知其所以然 2、那如何做到呢&#xff1f; 二、拥有良好的科研素养 1、多读文献 2、夯实基础&#xff0c;搞清原理 3、不断学习&#xff0c;擅于总结 4、团队协作&#xff0c;勤沟通&#xff0c;多交流 三、掌握一些…

RHCEansible静态主机清单

首先要做好免密登录 RHCEansible虚拟机初始化配置&#xff0c;ansible配置和安装_无所不知的神奇海螺的博客-CSDN博客 添加主机组 [rootserver ~]# vim /etc/ansible/hosts 或者 测试 [rootserver ~]# ansible node1 -m command -a hostname --- 引号里的是想要受控主机执行的…

Dell inspiron 5488加装硬盘SSD

机械盘真心便宜&#xff0c; 当数据盘很合适。 ———— 我是装双系统&#xff0c; 希望速度快&#xff01; 我就装了一个SSD&#xff0c; STAT接口的&#xff0c; 和机械盘盒一样尺寸&#xff0c; 接口都是SATA&#xff0c; 我买的三星860EVO&#xff0c; 500G&…

I06-python菜鸟教程查漏补缺

学习链接&#xff1a;Python3 教程 | 菜鸟教程 目录 1.基础知识 2.字符串 1.基础知识 多行语句&#xff1a;复数类型&#xff1a; 复数由实数部分和虚数部分构成&#xff0c;可以用 a bj&#xff0c;或者 complex(a,b) 表示&#xff0c; 复数的实部 a 和虚部 b 都是浮点型…

项目的生命周期

0、Preface/Foreword PLM:Product Lifecycle Management System,产品生命周期管理;可以在公司内部或者多个公司之间对于产品研发协同办公,集成与产品相关的人力资源,流程、应用系统和信息,用于支持产品全生命周期的信息创建、管理、分发和应用。 1、硬件产品开发流程 立…

2022年下半年信息系统项目管理师综合知识真题及答案21-40

21、关于项目论证、项目评估目的和作用的描述&#xff0c;不正确的是&#xff1a;&#xff08;&#xff09;。 A&#xff0e;项目论证应围绕市场需求、开发技术、财务经济三个方面开展 B&#xff0e;项目论证的作用是审查可行性研究的可靠性、真实性和客观性 C&#xff0e;项目…