CUDA内存模型

核函数性能并不只与线程束的执行有关。

CUDA内存模型概述

GPU和CPU内存模型的主要区别是,CUDA编程模型能将内存层次结构更好地呈现给用户,能让我们显示的控制它的行为。

对程序员来说,一般有两种类型的存储器:

  • 可编程的:需要显示的控制哪些数据存放在可编程内存中
  • 不可编程的:不能决定数据的存放位置,程序自动生成存放位置

CUDA内存模型提供了多种可编程的内存类型:

  • 寄存器
  • 共享内存
  • 本地内存
  • 常量内存
  • 纹理内存
  • 全局内存

图中所示为这些内存空间的层次结构,每个都有不同的作用域、生命周期和缓存行为。一个核函数中的线程都有自己私有的本地内存。一个线程块有自己的共享内存,对同一线程块内的所有线程可见,其内容持续线程块的整个生命周期。所有线程都可以访问全局内存。所有线程都能访问的只读空间有:常量内存和纹理内存。对一个应用程序来说,全局内存、常量内存和纹理内存中的内容具有相同的生命周期。

  1. 全局内存(Global Memory)

    • 特性:全局内存是GPU中所有线程共享的内存空间,可以被所有线程访问。
    • 优点:全局内存容量较大,适合存储大量数据。
    • 缺点:全局内存访问延迟较高,需要通过内存控制器访问,因此访问速度相对较慢。
    • 适用场景:适用于需要在不同线程之间共享数据的情况,但对访问速度要求不高的情况。
  2. 常量内存(Constant Memory)

    • 特性:常量内存是只读的内存空间,所有线程都可以读取其中的数据,但不能写入。
    • 优点:常量内存具有高速缓存,访问速度较快。
    • 缺点:常量内存容量有限(通常为64KB),且只能在程序启动时初始化。
    • 适用场景:适用于存储只读数据,且需要高速访问的情况,如常数表、查找表等。
  3. 纹理内存(Texture Memory)

    • 特性:纹理内存是一种特殊的只读内存,具有缓存和插值功能,适合于图像处理等需要纹理特性的应用。
    • 优点:纹理内存具有缓存和插值功能,可以提高某些类型数据的访问速度。
    • 缺点:容量相对较小,不能直接写入。
    • 适用场景:适用于需要纹理特性的数据访问,如图像处理、光线追踪等。

寄存器

寄存器是GPU上运行速度最快的内存空间。核函数中声明的变量通常储存在寄存器中。寄存器对每个线程来说是私有的。与核函数生命周期相同。

寄存器和线程不是一对一的,费米架构一个线程可以有63个寄存器,开普勒架构可以有255个寄存器。

如果,一个核函数使用了超过硬件限制数量的寄存器,则会用本地内存替代。这种寄存器溢出的情况会降低性能。

本地内存

核函数中符合存储在寄存器中但不能进入被该核函数分配的寄存器空间中的变量将溢出到本地内存中。

  • 在编译时,使用未知索引引用的本地数组
  • 可能会占用大量寄存器空间的较大本地结构体或数组
  • 任何不满足核函数寄存器限定条件的变量

共享内存

在核函数中使用如下修饰符修饰的变量存放在共享内存中

__shared__

每个SM都有一定数量的由线程块分配的共享内存。共享内存在核函数的范围内声明,其生命周期伴随着整个线程块。

共享内存是线程之间相互通信的基本方式。访问共享内存必须同步使用如下调用,

void __syncthreads();

SM中的一级缓存和共享内存都使用64KB的片上内存,通过静态划分,在运行时也可以进行动态配置。

片上内存(On-chip Memory)是指集成在芯片(例如GPU、CPU等处理器)内部的内存单元。与传统的外部内存(如RAM)相比,片上内存具有更低的访问延迟和更高的带宽,因为它们与处理器核心更加接近,减少了数据传输的距离和延迟。

常量内存

常量内存保存在设备内存中,每个SM都有自己专门用于缓存常量内存的缓存。

常量变量用以下修饰符修饰:

__constant__

常量变量必须在全局空间内和所有核函数之外进行声明。常量内存是静态声明的,并对同一编译单元内的所有核函数可见。

核函数只能从常量内存中读取数据,因此,常量内存必须在主机端由以下函数初始化

cudaError_t cudaMemcpyToSymbol(const void* symbol, const void* src, size_t count);

将count个字节从src指向的内存复制到symbol指向的内存中,这个变量存放在设备的全局内存或常量内存中。

线程束中的所有线程从相同的地址读取数据时,常量内存表现最好。比如,所有线程都需要读取一个公式的系数,对不同的数据根据同样的系数做相同的计算,这时,系数存放在常量内存中最好。

纹理内存

  • 特性:纹理内存是一种特殊的只读内存,具有缓存和插值功能,适合于图像处理等需要纹理特性的应用。
  • 优点:纹理内存具有缓存和插值功能,可以提高某些类型数据的访问速度。
  • 缺点:容量相对较小,不能直接写入。
  • 适用场景:适用于需要纹理特性的数据访问,如图像处理、光线追踪等。

纹理特性的数据访问指的是使用CUDA中的纹理内存(Texture Memory)来访问数据的一种特殊方式。纹理内存在访问数据时具有缓存和插值等特性,适用于某些类型的数据访问需求,例如图像处理、光线追踪等。纹理内存的特性包括以下几个方面:

  1. 缓存:纹理内存具有缓存功能,可以将最近访问的数据缓存在内存中,以提高后续访问相同数据的速度。这种缓存机制有助于减少对全局内存的访问次数,从而提高访问速度。

  2. 插值:纹理内存支持插值功能,可以对访问的数据进行插值计算,以获取平滑的插值结果。这在图像处理等需要对像素进行插值的应用中特别有用,可以减少图像处理过程中的锯齿状边缘或伪影现象。

  3. 边界处理:纹理内存支持边界处理功能,可以在访问超出边界的数据时进行特定的处理,例如将边界外的像素值设置为固定值或通过重复边界像素值来填充。

  4. 硬件优化:纹理内存的访问方式经过硬件优化,可以提高数据访问的效率,并充分利用GPU的并行计算能力。

全局内存

全局内存是GPU中最大、延迟最高且最常使用的内存。

可以使用如下修饰符静态声明一个全局内存变量

__device__

在主机端使用cudaMalloc函数分配全局内存,使用cudaFree函数释放全局内存。全局内存可以存在于应用程序的整个生命周期中,可以被所有核函数的所有线程访问。从多个线程访问全局变量时,由于线程之间不能跨线程块同步,不同线程块内的多个线程并发地修改全局内存变量可能会出现问题。

GPU缓存

与CPU缓存一样,GPU缓存是不可编程的内存。在GPU上有四种缓存

  • 一级缓存
  • 二级缓存
  • 只读常量缓存
  • 只读纹理缓存

每个SM都有一个一级缓存,所有的SM共享一个二级缓存。一级缓存和二级缓存都被用来存储本地内存和全局内存中的数据。

实践

静态声明一个全局变量,并且在一个核函数中修改值,在主机端获取修改后的值。

__device__ float num;

__global__ void test_num() {
    printf("the num is %f\n", num);
    num += 0.3;
}

int main(){
    float a = 3.14;

    cudaMemcpyToSymbol(num, &a, sizeof(float));
    test_num << <1, 1 >> > ();

    cudaMemcpyFromSymbol(&a, num, sizeof(float));
    cudaDeviceReset();

    cout << a;
    return 0;
}

这里面cudaMemcpyToSymbol函数在VS里可能会标红

显示num需要一个地址,其实并不是。在CUDA 编程指南手册里,

实际上动手做一下也会发现传地址结果会不同。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【docker 】 IDEA 安装 Docker 工具

打开File->Settings->Plugins 配置 Docker 的远程访问连接 Engine APIURL &#xff1a;tcp://192.168.0.1:2375 &#xff08;换成自己的docker开放端口&#xff09; 使用diea的docker插件 查看已有的镜像 创建一个容器 下面是最近更新的文章&#xff1a; 【docker 】 …

异地组网,让“远程运维”更简单

您是否在联网场景中有过这些需求&#xff1f; 摄像头需要联网统一监控、PLC需要联网告别本地升级、工控机需要联网告别本地配置、广告屏需要联网告别本地下载视频、远程打开终端设备WEB进行配置......这些问题有人新升级的“异地组网”功能统统可以解决&#xff01; 告别繁琐…

C++ 之CMake代码编译

1、编译过程 预处理-Pre-Processing //.i文件 # -E 选项指示编译器仅对输入文件进行预处理 g -E test.cpp -o test.i //.i文件 编译-Compiling // .s文件 # -S 编译选项告诉 g 在为 C 代码产生了汇编语言文件后停止编译 # g 产生的汇编语言文件的缺省扩展名是 .s g -S test…

LNMP部署及应用(Linux+Nginx+MySQL+PHP)

LNMP 我们为什么采用LNMP这种架构? 采用Linux、PHP、MySQL的优点我们不必多说。 Nginx是一个小巧而高效的Linux下的Web服务器软件&#xff0c;是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;已经在一些俄罗斯的大型网站上运行多年&#xff0c;目…

QT程序通过GPIB-USB-HS转接线控制数字万用表

1、硬件准备 1.1、数字万用表 型号 &#xff1a;Agilent 34401A 前面图示&#xff1a; 后面图示&#xff1a;有GPIB接口 1.2、GPIB-USB-HS转接线 2、GPIB协议基础了解 2.1、引脚 8条数据线&#xff1a;DIO1 ~ DIO8 5条管理线&#xff1a;IFC、ATN、REN、EOI、SRQ 3条交握线…

冯喜运:5.2原油三连跌引发连锁反应,黄金市场拐点已至?

【黄金消息面分析】&#xff1a;4月ADP就业数据的强劲表现&#xff0c;为美联储的货币政策提供了新的挑战。在这一背景下&#xff0c;黄金市场的反应尤为值得关注。本文将深入探讨美国就业数据对美联储决策的影响&#xff0c;以及这些决策如何影响黄金市场的未来走向。通胀与就…

TouchGFX 总结

文章目录 使用中文字体多屏幕间交换数据UI to MCUMCU to UI API文档参考横竖屏切换 使用中文字体 添加一个textArea&#xff0c;默认的英文文本可见&#xff0c;输入中文字体后就看不见了&#xff0c;是因为这个默认的字体不支持中文&#xff0c;改一下字体就可以了&#xff1…

Java_从入门到JavaEE_08

一、Eclipse开发工具的介绍 Eclipse工具简绍 Eclipse 是著名的跨平台的自由集成开发环境&#xff08;IDE&#xff09;。最初主要用来 Java 语言开发&#xff0c;但是目前亦有人通过插件使其作为其他计算机语言比如 C 和 Python 的开发工具。 下载与安装 下载&#xff1a; Ecli…

现代神经网络总结(AlexNet VGG GoogleNet ResNet的区别与改进)

VGG NIN GoogleNet 1.VGG&#xff0c;NIN&#xff0c;GoogleNet的块结构图对比(注意:无AlexNet) 这些块带来的区别与细节 AlexNet未使用块,主要对各个层进行了解: 卷积:捕捉特征 relu:增强非线性 池化层:减少计算量 norm:规范数据分布 全连接层:分类VGG块的改善(对比AlexNe…

在UI界面中播放视频_unity基础开发教程

在UI界面中播放视频_unity基础开发教程 前言操作步骤结语 前言 之前我写过一篇在场景中播放视频的文章&#xff0c;但是在开发中有时候也会在UI的界面中播放视频&#xff0c;这期我们做一下在UI的界面中播放视频。 操作步骤 首先在场景中创建一个Raw Image&#xff0c;UI->…

java-spring-mvc(服务端接收客户端传参)

目录 &#x1f3af; 服务端接收参数 ✨HttpServletRequest接收 ✨ 声明参数接收 ✨声明pojo类来接收 &#x1f52a;小试牛刀 &#x1f3af; 服务端接收参数 ✨HttpServletRequest接收 HttpServletRequest是Java Servlet规范中定义的一个接口&#xff0c;它提供了与HTTP请求…

【webrtc】RemoteAudioSource的创建线程

m98 代码&#xff1a;I:\webrtc m98_yjf\src\pc\rtp_transmission_manager.cc RtpTransmissionManager::CreateReceiver 在信令线程创建receiver receiver 是&#xff1a; rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>receiver;其实际…

Advanced RAG 05:探讨基于文本内在语义信息的数据分块方法

编者按&#xff1a;在 RAG (Retrieval Augmented Generation) 系统中&#xff0c;将文本数据高效地划分成相对独立且富有语义信息的数据块&#xff08;chunks&#xff09;是一项较为关键的任务。基于规则的传统数据分块方法存在一些问题&#xff0c;因此探讨基于文本内在语义信…

NASA数据集——VIIRS每日 L3深蓝气溶胶网格产品(AERDB_D3_VIIRS_SNPP),以 1 x 1 度

VIIRS/SNPP Deep Blue Level 3 monthly aerosol data, 1 degree x1 degree grid 简介 美国国家航空航天局&#xff08;NASA&#xff09;的可见红外成像辐射计套件&#xff08;VIIRS&#xff09;标准三级&#xff08;L3&#xff09;每月深蓝气溶胶产品来自苏米国家极轨伙伴关系…

PHP定时任务框架taskPHP3.0学习记录7宝塔面板手动可以执行自动无法执行问题排查及解决方案(sh脚本、删除超过特定天数的日志文件、kill -9)

PHP定时任务框架taskPHP3.0学习记录 PHP定时任务框架taskPHP3.0学习记录1&#xff08;TaskPHP、执行任务类的实操代码实例&#xff09;PHP定时任务框架taskPHP3.0学习记录2&#xff08;环境要求、配置Redis、crontab执行时间语法、命令操作以及Screen全屏窗口管理器&#xff0…

AWS最近宣布Amazon Q现已全面上市

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Gateway结合Nacos使用!!!

一、本地结合使用 1. 引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> 2. bootstarp.yml配置文件 如果Nacos中配置使用yaml格式&…

Ubuntu上的screenfetch

2024年4月28日&#xff0c;周日下午 这些文本是由一个叫做 “screenfetch” 的命令生成的&#xff0c;它会显示一些系统和用户信息&#xff0c;包括操作系统、内核版本、系统运行时间、安装的软件包数量、使用的Shell、分辨率、桌面环境、窗口管理器、主题、图标主题、字体、CP…

Linux(ubuntu)—— 用户管理user 用户组group

一、用户 1.1、查看所有用户 cat /etc/passwd 1.2、新增用户 useradd 命令&#xff0c;我这里用的是2.4的命令。 然后&#xff0c;需要设置密码 passwd student 只有root用户才能用passwd命令设置其他用户的密码&#xff0c;普通用户只能够设置自己的密码 二、组 2.1查看…

分布式任务调度平台XXL-JOB

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但是集群环境中Qu…