CUDA-内存访问模式

news2025/3/14 10:59:26

在 GPU 计算中,内存访问模式 直接影响程序的性能,尤其是 全局内存(global memory) 访问的合并性(coalescing)局部性(locality)


1. GPU 内存层次结构

GPU 具有多级存储,每一级的访问速度不同:

  • 寄存器(Register):每个线程私有,访问最快。
  • 共享内存(Shared Memory):线程块(Block)内共享,比全局内存快很多。
  • L1/L2 缓存(Cache):缓存局部数据,减少全局内存访问。
  • 全局内存(Global Memory):最慢,但存储量最大,需要优化访问模式。

2. 主要内存访问模式

(1) 合并访问(Coalesced Access)

线程按顺序访问连续的内存地址

  • 每个 warp(32 个线程)共同访问一段连续的全局内存
  • 减少内存事务(memory transactions),提高带宽利用率。

示例(合并访问)

__global__ void coalesced_access(float *A, float *B, int N) {
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    if (tid < N)
        B[tid] = A[tid];  // 线程按顺序访问连续地址
}

📌 优化要点

  • 按行加载(Row-major order) 比按列加载更好。
  • 让线程 ID 与数据索引匹配

(2) 非合并访问(Non-Coalesced Access)

🚨 线程访问不连续的内存地址

  • 每个线程访问的地址分散在不同的内存块,导致多个内存事务,降低效率。

示例(非合并访问)

__global__ void non_coalesced_access(float *A, float *B, int N, int stride) {
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    if (tid * stride < N)
        B[tid] = A[tid * stride];  // 线程访问间隔 stride
}

🚩 问题

  • 内存事务数增加,吞吐量降低
  • 不建议使用 stride 访问全局内存

(3) 行主序(Row-Major) vs. 列主序(Column-Major) 访问

  • 行主序存储(Row-major order):C 语言默认方式,数据按行优先存储。
  • 列主序存储(Column-major order):Fortran、MATLAB 采用,数据按列优先存储。

📌 访问模式建议

  • 矩阵遍历时,按存储方式优化访问方式避免列访问全局内存,可用共享内存优化。

示例(行访问更快)

// 行访问(合并访问)
for (int row = 0; row < N; row++)
    for (int col = 0; col < N; col++)
        B[row * N + col] = A[row * N + col];

// 列访问(非合并访问,性能低)
for (int col = 0; col < N; col++)
    for (int row = 0; row < N; row++)
        B[row * N + col] = A[col * N + row];  // 非合并访问

(4) 共享内存优化

使用 共享内存(shared memory) 解决非合并访问问题:

__global__ void shared_memory_access(float *A, float *B, int N) {
    __shared__ float tile[32][32];  // 共享内存 tile
    int row = threadIdx.y + blockIdx.y * blockDim.y;
    int col = threadIdx.x + blockIdx.x * blockDim.x;

    if (row < N && col < N) {
        tile[threadIdx.y][threadIdx.x] = A[row * N + col];  // 先加载到共享内存
        __syncthreads();
        B[col * N + row] = tile[threadIdx.y][threadIdx.x];  // 从共享内存存回
    }
}

共享内存缓存局部数据,提高访问效率


3. 访问模式优化策略

合并访问:线程访问连续地址,提高全局内存带宽利用率。
共享内存:减少不规则访问,提高数据重用。
优化存储顺序按行遍历按列遍历 快。
减少 stride 访问:避免跨步访问全局内存。
使用 L1 缓存(L1 cache)启用 L1 缓存优化非合并访问


4. 结论

访问模式内存层级访问效率典型应用
合并访问全局内存✅ 高效标量运算,向量计算
非合并访问全局内存❌ 低效矩阵按列访问
共享内存共享内存✅ 高效矩阵转置、卷积计算
寄存器寄存器✅ 最高线程局部变量

🚀 总结

  • 合并访问减少内存事务
  • 共享内存避免非合并访问
  • 行主序存储按行访问更快
  • 减少 stride 访问优化全局内存吞吐量

🔹 优化内存访问是 GPU 编程中提升性能的关键! 🚀

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

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

相关文章

img标签的title和alt

img标签的title和alt 显示上 title:鼠标移入到图片上时候显示的内容&#xff1b; alt:图片无法加载时候显示的内容; <div class"box"><div><!-- title --><h3>title</h3><img src"./image/poster.jpg" title"这是封…

Grafana——如何迁移Grafana到一台新服务器

背景 有时候由于服务器更新之类的&#xff0c;我们需要迁移一整套Grafana&#xff0c;这时候该怎么操作呢&#xff1f; 下面让我一步步说明下 安装Grafana 在新的服务器上安装Grafana 这个不再赘述&#xff0c;可以看一下我之前的文章 备份及迁移 迁移配置文件 配置文件即…

Flutter中 List列表中移除特定元素

在 Dart 语言里&#xff0c;若要从子列表中移除特定元素&#xff0c;可以使用以下几种方法&#xff0c;下面为你详细介绍&#xff1a; 方法一&#xff1a;使用 where 方法创建新列表 where 方法会根据指定的条件筛选元素&#xff0c;然后通过 toList 方法将筛选结果转换为新列…

一己之见:嵌入式linux开发板的选择(canmv还是...)

个人了解范围有限&#xff0c;仅仅介绍我略微了解的几个开发板。 野火&#xff0c;核桃&#xff0c;canmv&#xff0c;香蕉&#xff0c;香橙&#xff0c;庐山&#xff0c;地瓜&#xff0c;还有其他...。 野火资料全&#xff0c;型号多&#xff0c;接口丰富&#xff0c;支持usb…

多模态基础模型训练笔记-第一篇InternVL-g

一、TL&#xff1b;DR 将之前所有训练过的大模型的过程都总结和回忆一下&#xff0c;遇到的坑别忘了 二、问题记录 还是注意镜像的选择&#xff0c;选择社区最火的镜像&#xff0c;然后下载好对应的数据&#xff0c;主要显卡的选择&#xff0c;这个时候4090已经带不动了&…

微软AutoGen高级功能——Magentic-One

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;这次给大家分享的内容是微软AutoGen框架的高级功能Magentic-One。那么它是用来做什么的或它又是什么功能呢&#xff0c;我们直接进入正题。 Magentic-One Magnetic-One是一个通用型多智能体系统&#xff0c;用于…

Unity UI个人总结

个人总结&#xff0c;太简单的直接跳过。 一、缩放模式 1.固定像素大小 就是设置一个100x100的方框&#xff0c;在1920x1080像素下在屏幕中长度占比1/19&#xff0c;在3840x2160&#xff0c;方框在屏幕中长度占比1/38。也就是像素长款不变&#xff0c;在屏幕中占比发生变化 2.…

牛客小白月赛110

A智乃办赛 思路&#xff1a;用group表示是第几个大写英文字母&#xff0c;以A为基础&#xff0c;(n-1)/500为几则往上加几&#xff0c;从而得到应有的字母&#xff0c;用number表示当前组内的编号&#xff0c;(n-1)%5001表示&#xff0c;至于最后的前导0&#xff0c;在输出的时…

用大模型学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理

要深入浅出地理解条件概率与贝叶斯定理&#xff0c;可以从以下几个方面入手&#xff0c;结合理论知识和实例进行学习&#xff1a; 贝叶斯定理与智能世界的暗语 条件概率&#xff0c;全概率公式与贝叶斯公式的推导&#xff0c;理解和应用 拉普拉斯平滑 贝叶斯解决垃圾邮件分类 …

电商小程序(源码+文档+部署+讲解)

引言 随着移动互联网的快速发展&#xff0c;电商小程序成为连接消费者与商家的重要桥梁。电商小程序通过数字化手段&#xff0c;为消费者提供了一个便捷、高效的购物平台&#xff0c;从而提升购物体验和满意度。 系统概述 电商小程序采用前后端分离的架构设计&#xff0c;服…

基于单片机的开关电源设计(论文+源码)

本次基于单片机的开关电源节能控制系统的设计中&#xff0c;在功能上设计如下&#xff1a; &#xff08;1&#xff09;系统输入220V&#xff1b; &#xff08;2&#xff09;系统.输出0-12V可调&#xff0c;步进0.1V; &#xff08;3&#xff09;LCD液晶显示实时电压&#xff…

DeepSeek笔记(一):本地部署DeepSeek R1并搭建Web UI实现可视化交互的笔记

经过多天的挣扎和卸载了一些软件&#xff0c;终于下定决心在本地部署DeepSeek R1模型。部署和搭建过程非常简单和方便。 一、下载Ollama 进入Ollama官方网站(https://ollama.com),进入下载下载Ollama页面&#xff08;https://ollama.com/download&#xff09; 根据电脑的操作…

.NET 9.0 的 Blazor Web App 项目,Bootstrap Blazor 全局异常 <ErrorLogger> 使用备忘

一、全局异常 通过 <ErrorLogger> 组件实现&#xff0c;可以对全局的日志、异常进行统一输出&#xff0c;该组件【已经包含】在 <BootstrapBlazorRoot> 中&#xff0c;使用了 <BootstrapBlazorRoot> 组件包裹的 razor组件 【不用】再额外添加 <ErrorLogge…

每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块

本文重点 前面我们学习了VGG,从现在开始我们将学习谷歌公司推出的GoogLeNet。当年ImageNet竞赛的第二名是VGG,而第一名就是GoogLeNet,它的模型设计拥有很多的技巧,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构 GoogLeNet的网络结构 如图所示就是Go…

Unity Shader Graph 2D - Procedural程序化图形循环的箭头

前言 箭头在游戏开发中也是常见的一种图形之一,在游戏中箭头通常会用作道路引导或者指示,告诉玩家前进的方向,是比较重要的提示信号。本文将通过使用程序化图形来实现循环滚动的箭头效果,实践和熟悉Shader Graph的相关节点。 首先创建一个Shader Graph文件命名为Mo…

【Java学习】类和对象

目录 一、选择取块解 二、类变量 三、似复刻变量 四、类变量的指向对象 五、变量的解引用访问 1.new 类变量(参) 2.this(参) 3.类变量/似复刻变量. 六、代码块 七、复制变量的赋值顺序 八、访问限定符 1.private 2.default 九、导类 一、选择取块解 解引用都有可以…

探索高通骁龙游戏超分辨率技术:移动游戏的未来

高通技术公司于2024年推出了骁龙游戏超分辨率2&#xff08;Snapdragon Game Super Resolution 2&#xff0c;简称GSR2&#xff09;&#xff0c;这是一项全新的骁龙Elite Gaming功能&#xff0c;旨在最大化移动游戏的性能和电池寿命。 什么是骁龙游戏超分辨率2&#xff08;GSR2&…

LabVIEW 用户界面设计基础原则

在设计LabVIEW VI的用户界面时&#xff0c;前面板的外观和布局至关重要。良好的设计不仅提升用户体验&#xff0c;还能提升界面的易用性和可操作性。以下是设计用户界面时的一些关键要点&#xff1a; 1. 前面板设计原则 交互性&#xff1a;组合相关的输入控件和显示控件&#x…

[C++]多态详解

目录 一、多态的概念 二、静态的多态 三、动态的多态 3.1多态的定义 3.2虚函数 四、虚函数的重写&#xff08;覆盖&#xff09; 4.1虚函数 4.2三同 4.3两种特殊情况 &#xff08;1&#xff09;协变 &#xff08;2&#xff09;析构函数的重写 五、C11中的final和over…

KubeSphere 和 K8s 高可用集群离线部署全攻略

本文首发&#xff1a;运维有术&#xff0c;作者术哥。 今天&#xff0c;我们将一起探索如何在离线环境中部署 K8s v1.30.6 和 KubeSphere v4.1.2 高可用集群。对于离线环境的镜像仓库管理&#xff0c;官方推荐使用 Harbor 作为镜像仓库管理工具&#xff0c;它为企业级用户提供…