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

news2024/11/14 22:47:08

GPU存储结构模型

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

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

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

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

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

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

Shared Memory

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

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

Local Memory

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

Global Memory

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

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

Constant Memory

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

Texture Memory

    纹理存储器

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

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

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

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

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

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

在这里插入图片描述

GPU内存结构图:
在这里插入图片描述

2. 常用的设备存储API

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

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

float *d_a;
int nBytes = 32 * sizeof(float);
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决定了数据的拷贝方向;

cudaMemcpyHostToHost
cudaMemcpyHostToDevice: 由主机内存拷贝到设备内存;
cudaMemcpyDeviceToHost: 由设备内存拷贝到主机内存;
cudaMemcpyDeviceToDevice

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

cudaError_t cudaMemset(void* devPtr,int value,size_t count);
         使用固定字节值value来填充devPtr所指向存储器区域的前count个字节;

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

template<class T> 
cudaError_t cudaMemcpyToSymbol( const T& symbol,const void* src,size_t count,size_t offset,enum cudaMemcpyKind kind);
        主机数据拷贝到设备上的symbol处;Symbol可以是位于全局存储器或不变存储器空间内的变量,也可以是一个指定全局存储器或常数存储器空间变量的字符串。kind值是cudaMemcpyHostToDevice或cudaMemcpyDeviceToDevice。

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

template<class T> 
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/131379.html

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

相关文章

python网络程序设计,TCP协议客户端服务端智能聊天设计

计算机网络基础知识 网络体系结构&#xff0c;分层设计的好处 网络协议三要素&#xff1a;语法、语义、时序 常见应用层协议&#xff1a;ftp、http、smtp、pop3、telnet…… 传输层主要概念&#xff1a;TCP、UDP、端口号 IP地址 MAC地址 计算机网络基础知识 IP地址 1.IP地址 …

内核RCU的一次实践——实战中加深了理解

遍历内核链表是个常规操作&#xff0c;遍历链表过程可能会向链表增加新成员或者从链表剔除老成员&#xff0c;因此遍历链表时一般需要spin lock加锁保护。如果向链表增加新成员或者从链表剔除老成员不经常出现&#xff0c;大部分只是遍历查询链表中成员&#xff0c;此时链表遍…

Spring Cloud:eureka注册中心

在传统的单体应用中&#xff0c;所有的业务都集中在一个服务器中&#xff0c;当浏览器发起请求时&#xff0c;通过前端请求调用后端接口&#xff0c;后端接口调用相应的业务并在前端进行响应&#xff0c;整个的调用就是从请求到响应的一条龙服务。所以不存在服务之间的中转&…

jetson nano GPIO引脚控制舵机

文章目录一.舵机介绍二.舵机工作原理180度舵机360度舵机三.利用jetson nano GPIO控制舵机1.jetson nano与舵机接2.c编写程序输出脉冲(Qt做界面)一.舵机介绍 舵机&#xff0c;是指在自动驾驶仪中操纵飞机舵面&#xff08;操纵面&#xff09;转动的一种执行部件。分有&#xff1a…

代码随想录算法训练营第十三天(栈与队列)| 239. 滑动窗口最大值,347.前 K 个高频元素

代码随想录算法训练营第十三天&#xff08;栈与队列&#xff09;| 239. 滑动窗口最大值&#xff0c;347.前 K 个高频元素 239. 滑动窗口最大值 之前讲的都是栈的应用&#xff0c;这次该是队列的应用了。 本题算比较有难度的&#xff0c;需要自己去构造单调队列&#xff0c;建…

std::map使用方式以及注意事项(关于相同key的问题)

std::map的使用在C开发中也是经常会用到的一些东西&#xff0c;这里进行一些简单的使用记录&#xff0c;包括如何插入、删除以及修改等。 1、std::map插入&#xff1a; map的插入使用的是insert的方式&#xff0c;一个map包含了key与value两个值。首先需要对两个值进行赋值&a…

Spring Security认证授权练手小项目 腾讯视频VIP权限管理功能

腾讯视频VIP权限管理1、项目功能视频演示2、需求与设计1、需求2、功能概要3、接口设计3、项目源码结构4、项目源码下载5、项目部署1、部署架构2、数据库环境准备3、redis环境准备4、Spring Boot服务准备5、nginx负载均衡准备6、nginx静态资源服务器准备6、项目介绍1、技术架构2…

人工智能-集成学习

1、 集成学习算法介绍 1.1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题。工作原理&#xff1a;生成多个分类器/模型&#xff0c;各自独立地学习和做出预测。这些预测再结合成组合预测&#xff0c;因此由于任何一个单分类的预测。 1.2 机器学习的两个核心任…

优化RPC网络通信

文章目录什么是RPC通信RPCRPC框架SOARPC通信得重要性具体优化措施1.扩展其他RPC框架.2.选择合适的通信协议3.使用单一长连接4.优化Socket通信.5.高性能的序列化协议6.量身定做报文格式什么是RPC通信 RPC RPC&#xff08;Remote Process Call&#xff09;&#xff0c;即远程服…

算法训练 —— 链表(2)

目录 1. LeetCode24. 两两交换链表中的结点 2. LeetCode19. 删除链表的倒数第N个节点 3. LeetCode160.相交链表 4. LeetCode141.环形链表 5. LeetCode142.环形链表II 6. LeetCode138.复制带随机指针的链表 1. LeetCode24. 两两交换链表中的结点 两两交换链表中的结点 …

机器学习时间序列特征处理与构造,这篇我建议你收藏

数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 那特征工程是什么&#xff1f; 特征工程是利用数据领域的相关…

vue3 antd项目实战——Form表单使用【v-model双向绑定数据,form表单嵌套input输入框、Radio单选框】

vue3 ant design vue项目实战——单选框&#xff08;Radio&#xff09;的使用以及Form表单的双向绑定知识调用&#xff08;form表单的源代码附在文章最后&#xff09;场景复现实现需求form表单整体架构的搭建input输入框文本域的嵌套单选组合Radio的嵌套button按钮组合的嵌套fo…

小米手机不为人知的秘密—后台静默安装任何应用

导读你是否拥有一台小米&#xff0c;HTC&#xff0c;三星或者是一加的 Android 手机呢&#xff1f;如果回答是肯定的&#xff0c;那么你应该意识到&#xff0c;几乎所有的智能手机厂商提供的定制 ROM&#xff0c;如 CyanogenMod、Paranoid Android、 MIUI 或者一些其它的 ROM 都…

再谈指针(12)

目录 1、字符指针 2、指针数组 3、数组指针 1、定义 2、&数组名VS数组名 3、数组指针的使用 1、二维数组的数组名 4、数组参数、指针参数 1、一维数组传参 2、二维数组传参 3、一级指针传参 4、二级指针传参 5、函数指针 6、函数指针数组 7、指向函数指针数…

SpringCloud之Sleuth全链路日志跟踪

文章目录1 Sleuth链路跟踪1.1 分布式系统面临的问题1.2 Sleuth是什么1.3 Zipkin是什么1.4 链路监控相关术语1.5 实战练习1.5.1 pom.xml1.5.2 添加yml配置1.5.3 添加控制器1.5.4 测试访问1.6 Zipkin1.6.1 下载与启动1.6.2 搭建链路监控步骤1.6.2.1 搭建8990提供者1.6.2.2 搭建89…

08 `.o`中的汇编信息 hopper disassembler 调试 HelloWorld

前言 上周[2020.05.23]想要 直接使用 fastdebug 版本的 jdk 来进行调试, 可惜失败了 原来是 缺少 可执行文件关联的, object file, 里面记录了 关联的源码的一些信息 看来还是 免不了, 需要 手动 编译 open jdk, 哎 本文主要是两个东西 : 1. 查看 object file 中的汇编信…

CSS权威指南(一)CSS概述

文章目录1.元素2.引入样式表3.样式表4.媒体查询5.特性查询1.元素 &#xff08;1&#xff09;置换元素和非置换元素 置换元素&#xff0c;指用来置换元素内容的部分不由文档内容直接表示。比如img标签。非置换元素&#xff0c;元素的内容是由用户代理在元素自身生成的框中显示…

这样的C盘或许还有?救救C盘......

C盘红了&#xff01;&#xff01;&#xff01; 大部分软件默认缓存在C盘&#xff08;有的甚至只能安装到C盘&#xff09; C盘太满电脑运行会很卡顿 对于这种情况&#xff0c;为了节约C盘空间&#xff0c;我们可以将这些被迫存在C盘的文件挪到其他盘 但是有的应用无法更改默…

C++ 显示图片

编译环境为codeblocks 20.03&#xff0c;编译器为mingw64非自带的版本&#xff08;版本号多少忘记了&#xff09; 头文件 #include <graphics.h>//图形库 #include <conio.h>//_getch() 显示图片代码 int main() {initgraph(640,360,EX_SHOWCONSOLE);//初始化绘…

我亲身经历的2022年软件质量工作——测试工作的经验总结及一些建议

2022年对于大部分人来说都是辛苦的一年。对于整个社会&#xff0c;疫情反反复复&#xff0c;折磨的每一个人都心力交瘁。 经济下滑&#xff0c;失业率上升似乎听到的都是不好的消息。对于整个互联网行业也频频传出大厂裁员的消息。 而质量团队在大厂的裁员计划里也是首当其冲。…