笔记04:全局内存

这篇具有很好参考价值的文章主要介绍了笔记04:全局内存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、CUDA内存模型概述

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

笔记04:全局内存,CUDA,笔记,开发语言

 一个核函数中的线程都有自己私有的本地内存

一个线程块有自己的共享内存,对同一个线程块中所有的线程都可见,其内容持续线程块的整个生命周期。

所有线程都可以访问全局内存

所有线程都可以访问的只读空间有:常量内存空间纹理内存空间。其中纹理内存为各种数据布局提供了不同的寻址模式和滤波模式。

对于一个应用程序来说,全局内存、常量内存和纹理内存中的内容具有相同的生命周期。

1. 寄存器

核函数中声明的一个没有其他修饰符的自变量,通常存储在寄存器中。在核函数声明的数组中,如果用于引用该数组的索引是常量且能在编译时确定,那么该数组也存储在寄存器中。

寄存器是一个在SM中由活跃线程束划分出的较少资源。在核函数中使用较少的寄存器将使在SM上有更多的常驻线程块。每个SM上并发线程块越多,使用率和性能就越高。

如果一个核函数使用了超过硬件限制数量的寄存器,则会用本地内存代替多占用的寄存器。这种寄存器溢出会给性能带来不利影响。

2. 本地内存

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

溢出到本地内存中的变量本质上与全局内存在同一块存储区域,因此本地内存访问的特点是高延迟核低带宽。

3. 共享内存

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

因为共享内存是片上内存,所以与本地内存或全局内存相比,其具有更高的带宽和更低的延迟。其使用类似于CPU一级缓存,是可编程的。

每一个SM都有一定数量的由线程块分配的共享内存。

共享内存在核函数的范围内声明,其生命周期伴随着整个线程块。当一个线程块执行结束后,其分配的共享内存将被释放并重新分配给其他线程块。

共享内存是线程间互相通信的基本方式,一个块内的线程通过使用共享内存中的数据可以相互合作。访问共享内存必须同步使用如下调用:void __syncthreads();

4. 常量内存

__constant__

常量内存驻留在设备内存中,并在每个SM专用的常量中缓存。

常量变量必须在全局空间内和所有核函数之外进行声明。

笔记04:全局内存,CUDA,笔记,开发语言

在大多数情况下这个函数是同步的。

线程束中所有线程从相同的内存地址中读取数据时,常量内存表现最好。数学公式中的系数是可以使用常量内存的。 

5. 纹理内存

6. 全局内存

__device__

在主机端使用cudaMalloc函数分配全局内存,使用cudaFree函数释放全局内存。

7. GPU缓存

8. CUDA变量声明总结

笔记04:全局内存,CUDA,笔记,开发语言

9. 静态全局内存

二、内存管理

1. 内存分配和释放

在主机上使用cudaMalloc()函数分配全局内存

从主机上传输数据填充所分配的全局内存:cudaMemset()

一旦一个应用程序不再使用已分配的全局内存,可以释放该内存空间:cudaFree()

设备内存的分配和释放操作成本较高,所以应用程序应重利用设备内存,以减少对整体性能的影响。

2. 内存传输

cudaMemcpy(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind);

笔记04:全局内存,CUDA,笔记,开发语言

 笔记04:全局内存,CUDA,笔记,开发语言

 CUDA编程的一个基本原则应是尽可能地减少主机和设备之间的传输。

3. 固定内存

笔记04:全局内存,CUDA,笔记,开发语言

 GPU不能在可分页主机内存上安全地访问数据,因为当主机操作系统在物理位置上移动该数据时,它无法控制。当从可分页主机内存传输数据到设备内存时,CUDA驱动程序首先分配临时页面锁定的或固定的主机内存,将树脂基源数据复制到固定内存中,然后从固定内存传输数据给设备内存。

CUDA运行时允许直接分配主机内存:

cudaMallocHost(void **devPtr, size_t count);

固定主机内存必须通过下述指令来释放:

cudaFreeHost(void *ptr);

与可分页内存相比,固定内存的分配和释放成本更高,但是它为大规模数据传输提供了更高的传输吞吐量。

4. 零拷贝内存

零拷贝内存:主机和设备都可以访问零拷贝内存。

零拷贝内存是固定内存,该内存映射到设备地址空间中。可以通过下列函数创建一个到固定内存的映射:

cudaError_t cudaHostAlloc(void **pHost, size_t count, unsigned int flags);

释放:cudaFreeHost()

flags: 

(1)cudaHostAllocDefault;(2)cudaHostAllocPortable;(3)cudaHostAllocWriteCombined;(4)cudaHostAllocMapped

cudaHostGetDevicePointer(void **pDevice, void *pHost, unsigned int flags);文章来源地址https://www.toymoban.com/news/detail-648401.html

5. 统一虚拟寻址(UVA)

到了这里,关于笔记04:全局内存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实验笔记之——Ubuntu20.04配置nvidia以及cuda并测试3DGS与SIBR_viewers

    之前博文测试3DGS的时候一直用服务器进行开发,没有用过笔记本,本博文记录下用笔记本ubuntu20.04配置过程~ 学习笔记之——3D Gaussian Splatting源码解读_3dgs运行代码-CSDN博客 文章浏览阅读3.2k次,点赞34次,收藏62次。高斯模型的初始化,初始化过程中加载或定义了各种相关的

    2024年04月15日
    浏览(32)
  • [开发语言][c++]:Static关键字和全局变量

    写在前面: 如果您只是想回顾或了解一下static和全局变量的异同点,那么下面的总结将满足您的需求。 如果您是一位初学者或对二者的使用模棱两可,建议您读完该篇文章,相信这一篇将解答完您对于static以及全局变量的所有疑惑。 如有问题或建议欢迎评论 or 私信

    2024年01月20日
    浏览(44)
  • RK3588开发板编译环境Ubuntu20.04编译配置增加交换内存

    迅为提供的编译环境 Ubuntu20.04 默认配置了交换内存是 9G,如果在编译过程中,因内 存不够而编译报错,可以参考本小节进行设置。 这里举例分配 5G 交换内存。 在开始之前,使用命令检查一下您的 ubuntu 的 swap 分区。 sudo swapon --show 通过以下命令创建一个用于 swap 的文件 su

    2024年02月11日
    浏览(32)
  • 【操作系统笔记04】操作系统之内存管理方式(分页、分段、段页式)、虚拟存储技术、页面置换算法

    这篇文章,主要介绍操作系统之内存管理方式(分页、分段、段页式)、虚拟存储技术、页面置换算法。 目录 一、操作系统 1.1、基地址变换机构 1.2、具有快表的地址变换机构

    2023年04月21日
    浏览(30)
  • 微信小程序开发学习笔记《7》全局配置以及小程序窗口

    博主正在学习微信小程序开发,希望记录自己学习过程同时与广大网友共同学习讨论。全局配置官方文档 小程序根目录下的app.json 文件是小程序的全局配置文件。 常用的配置项如下: pages记录当前小程序所有页面的存放路径 window 全局设置小程序窗口的外观 tabBar 设置小程序底

    2024年01月21日
    浏览(37)
  • 完整的Ubuntu20.04+ROS+PX4+Anaconda+PyTorch+GPU+CUDA+CUDNN+XTdrone配置智能无人机开发环境搭建过程

    我之前写了如何在Ubuntu18下搭配一系列软件的教程,然后近期重新安装20.04版本,于是重新记录一些东西,但是众多东西之前已经有了,所以我在这里知会在一些不同的地方和新增的地方特别说明,其他的请大家看之前的博客。 在搞了这么久的ros和px4之后,我也明白了xtdrone是

    2024年02月05日
    浏览(45)
  • 【go语言学习笔记】04 Go 语言工程管理

    1. 单元测试 单元测试是保证代码质量的好方法,但单元测试也不是万能的,使用它可以降低 Bug 率,但也不要完全依赖。除了单元测试外,还可以辅以 Code Review、人工测试等手段更好地保证代码质量。 1.1 定义 顾名思义,单元测试强调的是对单元进行测试。在开发中,一个单

    2024年02月13日
    浏览(32)
  • 开发笔记 | JAVA过滤器Filter实现全局接口入参去除前后空格

    目录 思考过程 遇到的问题 过滤器Filter使用步骤 全局去除入参前后空格代码实现 处理过程中自己造成的一些问题 需求背景: 前端所有的条件查询去除前后空格,如搜 【\\\"   测试    \\\"】后端将其转为【测试】。之前都是前端统一处理的,但是这次要后端处理,那么就得考虑

    2024年02月12日
    浏览(30)
  • 【HarmonyOS北向开发】-04 ArkTS开发语言-ArkTS基础知识

     飞书原文档:Docs

    2024年02月11日
    浏览(39)
  • Go语言开发者的Apache Arrow使用指南:内存管理

    如果你看了上一篇《Go语言开发者的Apache Arrow使用指南:数据类型》 [1] 中的诸多Go操作arrow的代码示例,你很可能会被代码中大量使用的Retain和Release方法搞晕。不光大家有这样的感觉,我也有同样的feeling:**Go是GC语言 [2] ,为什么还要借助另外一套Retain和Release来进行内存管理

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包