CUDA从入门到放弃(六):CUDA内存结构(Memory Hierarchy)

news2024/11/15 14:21:57

CUDA从入门到放弃(六):CUDA内存结构(Memory Hierarchy)

CUDA线程在执行过程中可以从多个内存空间访问数据。每个线程都有私有的局部内存。每个线程块具有共享内存,该内存对所有线程块内的线程可见,并且与线程块具有相同的生命周期。线程块集群中的线程块可以相互执行对共享内存的读取、写入和原子操作。所有线程都可以访问相同的全局内存。

此外,还有两个所有线程都可以访问的只读内存空间:常量内存空间和纹理内存空间。

对于同一应用程序来说,全局内存、常量内存和纹理内存空间在内核启动之间是持久的。
在这里插入图片描述

1 全局内存 Global Memory

全局内存位于设备内存中,通过32字节、64字节或128字节的内存事务进行访问。这些内存事务必须自然对齐:只有对齐到其大小(即,其首地址是其大小的倍数)的设备内存的32字节、64字节或128字节段才能通过内存事务进行读取或写入。

当warp执行访问全局内存的指令时,它会根据每个线程访问的字的大小以及内存地址在线程之间的分布,将warp内部线程的内存访问合并为一个或多个这些内存事务。一般来说,所需的交易越多,除了线程访问的字之外,传输的未使用字就越多,从而相应地降低了指令吞吐量。例如,如果为每个线程的4字节访问生成一个32字节的内存事务,则吞吐量将减少到原来的八分之一。

大小和对齐要求

全局内存指令支持读写大小为1、2、4、8或16字节的数据。只有当数据类型大小符合这些值,并且数据自然对齐(地址是大小的倍数)时,访问才会编译为单个全局内存指令。

若不满足此要求,访问将编译为多个具有交错访问模式的指令,导致指令无法完全合并。因此,建议使用满足这些要求的类型来处理全局内存中的数据。

内置向量类型会自动满足对齐要求。对于结构体,可以使用__align__(8)或__align__(16)来确保对齐。

struct __align__(8) {
    float x;
    float y;
};

struct __align__(16) {
    float x;
    float y;
    float z;
};

全局内存中的变量地址或由相关API返回的地址至少对齐到256字节。读取非自然对齐的8或16字节数据会产生错误结果,因此需特别注意保持对齐。特别是在使用自定义的全局内存分配方案时,应确保每个数组的起始地址正确对齐。

2 局部内存 Local Memory

局部内存空间位于设备内存中,因此局部内存访问与全局内存访问具有相同的高延迟和低带宽,并且必须满足与设备内存访问中描述的相同内存合并要求。然而,局部内存的组织方式是,连续的32位字由连续的线程ID访问。因此,只要warp中的所有线程访问相同的相对地址(例如,数组变量中的相同索引,结构变量中的相同成员),访问就会完全合并。

局部内存访问仅发生在某些自动变量上。编译器可能将以下自动变量放置在局部内存中:

  • 它无法确定使用常量索引访问的数组,
  • 会消耗过多寄存器空间的大型结构或数组,
  • 如果内核使用的寄存器数量超过可用数量(这也称为寄存器溢出)时的任何变量。

3 共享内存 Shared Memory

由于共享内存位于芯片上,因此它相比本地内存或全局内存具有更高的带宽和更低的延迟。

为了实现高带宽,共享内存被分割成大小相等的内存模块,称为内存bank,这些bank可以同时访问。因此,任何由n个不同内存bank中的地址组成的内存读或写请求都可以同时得到服务,从而得到比单个模块带宽高出n倍的整体带宽。

然而,如果内存请求的两个地址落在同一个内存银行中,就会发生bank冲突,并且访问必须串行化。硬件会将带有bank冲突的内存请求拆分成尽可能多的单独的无冲突请求,吞吐量将降低一个等于单独内存请求数量的因子。如果单独的内存请求数量是n,那么初始内存请求就被认为是造成了n路bank冲突。

4 常量内存 Constant Memory

常量内存空间位于设备内存中,并缓存在常量缓存中。

然后,请求会根据初始请求中不同内存地址的数量拆分成多个单独的请求,吞吐量将降低一个等于单独请求数量的因子。

在缓存命中的情况下,生成的请求将以常量缓存的吞吐量进行处理;否则,将以设备内存的吞吐量进行处理。

5 纹理和表面内存 Texture and Surface Memory

纹理和表面内存空间位于设备内存中,并被缓存在纹理缓存中。因此,只有在缓存未命中的情况下,纹理获取或表面读取才会从设备内存中进行一次内存读取,否则仅从纹理缓存中进行一次读取。纹理缓存针对二维空间局部性进行了优化,因此,在二维空间中读取纹理或表面地址相近的同一warp中的线程将实现最佳性能。此外,它还设计用于具有恒定延迟的流式获取;缓存命中可以减少对DRAM带宽的需求,但不会减少获取延迟。

通过纹理或表面获取读取设备内存具有一些优势,这使得它成为从全局或常量内存读取设备内存的有利替代方案:

如果内存读取不遵循全局或常量内存读取必须遵循的访问模式以获得良好性能,那么只要纹理获取或表面读取中存在局部性,就可以实现更高的带宽;

寻址计算由专用单元在内核外部执行;

可以通过单个操作将打包的数据广播到单独的变量中;

8位和16位整数输入数据可以选择性地转换为范围在[0.0, 1.0]或[-1.0, 1.0]内的32位浮点数值。

参考资料
1 CUDA编程入门
2 CUDA编程入门极简教程
3 CUDA C++ Programming Guide
4 CUDA C++ Best Practices Guide
5 NVIDIA CUDA初级教程视频
6 CUDA专家手册 [GPU编程权威指南]
7 CUDA并行程序设计:GPU编程指南
8 CUDA C编程权威指南

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

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

相关文章

磁盘文件系统实际操练,解释到bit

author: hjjdebug date: 2024年 03月 25日 星期一 17:50:02 CST description: 磁盘文件系统实际操练,解释到bit文章目录 0. 为什么需要磁盘文件系统.1. 磁盘文件系统的任务是什么?2. 空白磁盘是什么? 空白磁盘数据长什么样?3. 格式化磁盘都干了什么? 格式化后的磁盘长什么…

YoloV8改进策略:Neck改进|ECA-Net:用于深度卷积神经网络的高效通道注意力|多种改进方法|附结构图

摘要 本文使用ECA-Net注意力机制加入到YoloV8中。我尝试了多种改进方法,并附上改进结果,方便大家了解改进后的效果,为论文改进提供思路。 论文:《ECA-Net:用于深度卷积神经网络的高效通道注意力》 arxiv.org/pdf/19…

“一根盲杖,扫清前进道路”视障人士关爱行动中

近期,红枫林义警服务发展中心联合暨南街道社工站,面向暨南街道辖区内的视障人群,开展了一系列服务,送去了我们的关爱。 首先,我们成功为视障人群链接到了价值1万的爱心物资,捐赠仪式即为本次我们关爱行动的…

计算机组成原理 中断原理实验

一、实验目的 (1)从硬件,软件结合的角度,模拟单级中断和中断返回的过程 (2)通过简单的中断系统,掌握中断控制器、中断向量、中断屏蔽等概念 (3)了解微程序控制器与中断…

批量文本管理:一键合并与智能分隔,让文档处理更高效!

在信息爆炸的时代,我们每天都面临着海量的文本信息,从工作文件到个人笔记,从学术论文到社交媒体帖子,管理这些文本内容成为一项巨大的挑战。如何高效地合并、整理这些散乱的文本,使其有序且易于检索?今天&a…

后端常问面经之Java集合

HashMap底层原理 HashMap的数据结构: 底层使用hash表数据结构,即数组和链表或红黑树 当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标 存储时,如果出现hash值相同的key,此…

⨯ EPERM: operation not permitted, link ...

新增区块链相关包后,项目在部署的时候报错,报错内容如下: 报错信息: ⨯ EPERM: operation not permitted, link /Users/XXX/.cache/act/be662ca67b3f7553/hostexecutor/node_modules/bigint-buffer/build/node_gyp_bins/python…

【数据结构刷题专题】—— 二叉树

二叉树 二叉树刷题框架 二叉树的定义: struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(NULL), right(NULL); };1 二叉树的遍历方式 【1】前序遍历 class Solution { public:void traversal(TreeNode* node, vector&…

「Nginx」Nginx配置详解

「Nginx」Nginx配置详解 参考文章1、正向代理和方向代理2、指定域名允许跨域 参考文章 1、Nginx反向代理 2、nginx配置详解 3、Nginx服务器之负载均衡策略(6种) 1、正向代理和方向代理 2、指定域名允许跨域 map $http_origin $allow_cors {default 1;…

4D 毫米波雷达前景

目录 传统雷达检测流程 行业首先 存在问题 解决方案 雷达数据集 1)3D检测 2) 场景估计 4D毫米波雷达的未来发展趋势 4D毫米波雷达是指一种高级的雷达系统,它能够提供三维空间信息(即长度、宽度、高度)和第四维…

数据清洗(一)Excel

一、引言 线上出现问题之后的数据清洗是少不了的,有的可以直接通过接口或者mq补偿,有的写sql更新db就可以,但是在匹配关系比较复杂的时候就需要建立临时表做关联匹配,数据量不大可以直接用excel进行匹配。 二、Excel清洗数据 作者…

如何在VS Code上搭建 C/C++开发环境

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、什么是VScode VScode(Visual Studio Code)是一款由微软开发的免费开源的轻量级代码编辑器。它…

【Android】美团组件化路由框架WMRouter源码解析

前言 Android无论App开发还是SDK开发,都绕不开组件化,组件化要解决的最大的问题就是组件之间的通信,即路由框架。国内使用最多的两个路由框架一个是阿里的ARouter,另一个是美团的WMRouter。这两个路由框架功能都很强大&#xff0…

JavaScript 中内存泄漏的几种情况(非常详细)

文章目录 一、是什么二、垃圾回收机制标记清除引用计数小结 三、常见内存泄露情况参考文献 一、是什么 内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存 并非指内存在物理上的消失,而…

如何使用 ArcGIS Pro 制作三维建筑

三维地图已经逐渐成为未来地图的趋势,对于大范围应用,只需要普通的建筑体块就行,如果有高程数据,还可以结合地形进行显示,这里为大家介绍一下 ArcGIS Pro 制作三维建筑的方法,希望能对你有所帮助。 数据来…

容器镜像加速指南:探索 Kubernetes 缓存最佳实践

介绍 将容器化应用程序部署到 Kubernetes 集群时,由于从 registry 中提取必要的容器镜像需要时间,因此可能会出现延迟。在应用程序需要横向扩展或处理高速实时数据的情况下,这种延迟尤其容易造成问题。幸运的是,有几种工具和策略…

文件操作示例

1.C文件操作 1.1文件的使用方式 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include<errno.h>int main() {FILE* pf fopen("test.txt", "w");if (pf NULL){printf("%s\…

2015年认证杯SPSSPRO杯数学建模C题(第二阶段)荒漠区动植物关系的研究全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 C题 荒漠区动植物关系的研究 原题再现&#xff1a; 环境与发展是当今世界所普遍关注的重大问题, 随着全球与区域经济的迅猛发展, 人类也正以前所未有的规模和强度影响着环境、改变着环境, 使全球的生命支持系统受到了严重创伤, 出现了全球变暖…

代码随想录算法训练营第二十一天(二叉树VII)| 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先(JAVA)

文章目录 530. 二叉搜索树的最小绝对差解题思路源码 501. 二叉搜索树中的众数解题思路源码 236. 二叉树的最近公共祖先解题思路源码 530. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&a…

High 级别反射型 XSS 攻击演示(附链接)

环境准备 如何搭建 DVWA 靶场保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开靶场找到该漏洞页面 先右键检查输入框属性 还是和之前一样的&#xff0c;所以直接输入 HTML 标签提交…