CUDA 编程学习 (5)——内存访问性能

news/2025/1/15 6:24:31/文章来源:https://www.cnblogs.com/Astron-fjh/p/18519222

1. DRAM 带宽

1.1 DRAM 核心阵列结构

  • 每个 DRAM 核心阵列约有 \(16M\) bits
  • 每个 bits 存储在由一个晶体管组成的微小电容器中
image-20240925134523219
  • 超小型(8x2-bit)DRAM 内核阵列
image-20240925134615999

1.2 DRAM 核心阵列速度慢

  • 从核心阵列单元读取数据的过程非常缓慢

    • DDR:Core speed = \(\frac{1}{2}\) interface speed

    • DDR2 / GDDR3:Core speed = \(\frac{1}{4}\) interface speed

    • DDR3 / GDDR4:Core speed = \(\frac{1}{8}\) interface speed

    • \(\cdots\) 之后可能会更糟

image-20240925135043015

1.3 DRAM Bursting

  • 对于 DDR{2,3} SDRAM 内核,时钟频率为接口速度的 \(\frac{1}{N}\)
    • 将同一行的 DRAM bits 一次性加载(\(N × interface\ width\))到内部缓冲区,然后以接口速度分 N 步传输
    • DDR3 / GDDR4\(buffer\ width = 8X\ interface\ width\)

1.3.1 DRAM Bursting Timing 示例

image-20240925135517138

现代 DRAM 系统设计为始终以 burst 模式访问。burst bytes 被传输到处理器,但在访问非连续位置时会被丢弃。

1.3.2 DRAM Bursting with Banking

  • 多个 DRAM Banks 结构
image-20240925135929159
  • DRAM Bursting with Banking
image-20240925140042154

1.4 GPU 片外内存子系统

  • NVIDIA RTX6000 GPU
    • global memory 峰值带宽 = \(672GB/s\)
  • global memory (GDDR6) 接口 @7GHz
    • \(14\ Gbps\) 针脚速度
    • 对于 GDDR6 32 位接口,我们只能维持约 \(56\ GB/s\) 的速度
    • 我们需要更大的带宽(\(672\ GB/s\)), 因此需要 12 个 memory channels

2. CUDA 中的内存聚合

2.1 DRAM Burst —— 系统视图

image-20240925141047894
  • 每个地址空间被划分为 burst 段

    • 每当访问一个位置时,同一 burst 段中的所有其他位置也会被传送到处理器中
  • 基本示例如图:16-byte 地址空间,4-byte burst 段

    • 实际上,我们至少有 4GB 的地址空间,burst 段大小为 128-byte 或更多

2.2 内存聚合

image-20240925141456180

当一个 warp 中的所有 thread 都执行一个 load 指令时,如果所有被访问的位置都属于同一 burst 段,那么只会发出一个 DRAM 请求,并且访问是完全聚合的。

2.3 非聚合访问

image-20240925141721003
  • 当被访问的位置跨越 burst 段边界时:
    • 聚合失败
    • 发出多个 DRAM 请求
    • 访问未完全聚合
  • 访问和传输的部分 bytes 未被 threads 使用

2.4 如何判断一个访问是否聚合

  • 如果数组访问中的索引形式为

\[A[(expression\ with\ terms\ independent\ of\ threadIdx.x) + threadIdx.x] \]

  • 线性内存空间中的二维 C 阵列(按地址递增的线性化顺序)
image-20240925151207090

2.4.1 基本矩阵乘法的两种访问模式

image-20240925151337257

i 是 kernel code 内积循环中的循环计数器,A 大小为 \(m\times n\),B 大小为 \(n\times k\)

\[Col = blockIdx.x * blockDim.x + threadIdx.x \]

  • B 访问模式是聚合的
image-20240925151809212
  • A 访问模式不是聚合的
image-20240925151904273

2.4.2 加载输入 tiles

image-20240925153046525

让每个 thread 在与其 C 元素相同的相对位置加载一个 A 元素和一个 B 元素。

  • int tx = threadIdx.x
  • int ty = threadIdx.y

访问 tile 0 2D 索引:

  • A[Row][tx]
  • B[ty][Col]
image-20240925153453522

原始访问模式 (Original Access Pattern)

在左上角的 d_M 矩阵和右上角的 d_N 矩阵中,红色线条代表传统的逐元素访问方式。在这种模式下:

  • 每个线程直接从全局内存中获取所需的矩阵元素,并进行计算。
  • 这种访问方式可能导致频繁的全局内存访问,效率较低,因为每次访问都要从全局内存中读取数据。

分块访问模式 (Tiled Access Pattern)

在分块访问模式中:

  • d_Md_N 矩阵被分成多个小块(蓝色区域),每个小块会被加载到共享内存中。
  • 每个线程块只需要将其负责的矩阵 tile 拷贝到共享内存,然后对共享内存中的数据进行计算。
  • 通过将小块 tile 加载到共享内存中,线程可以更快地重复使用共享内存中的数据,从而减少了全局内存的访问频率,提高了整体性能。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

射蜡工序流程图

包含工序:射蜡件、射水溶芯、射尿素芯、化芯、射刺头、射冷蜡块、射牙套、射帽。 前后序:(射芯射配件转至射蜡件)、平行工序(射水溶芯、尿素芯、牙套、刺头) 工序交集点:射水溶芯、射尿素芯 转修蜡修芯 转射蜡件,化芯转修蜡,射蜡首检件转检验,检验合格转修蜡。

定时调度框架Quartz使用

使用背景 在最近的项目中遇到一个需要使用到动态定时任务的需求,即定时任务的调用时间不是在某个固定时间自动执行,而是由用户控制,并且需要持久化。因此在网上搜了一下,发现了一个基于Java开发的Quartz定时任务调度框架,很符合我的需求,因此记录一下便于以后再次使用。 …

网络重置后WiFi列表消失

打开服务 启动WLAN AutoConfig

当然不是草台班子 云译网 原型设计+概要设计

作业所属课程 软件工程2024作业要求 2024秋软工实践团队作业-第二次作业目标 设计出原型与后端架构团队名称 当然不是草台班子团队成员学号 姓名102201427 侯丽珂102201426 郑嘉祺102201241 戴康怡102201218 肖晗涵112200328 谢李东292300304 陈鹭102201242 魏儀阳082100170 朱…

【入门笔记】CSE 365 - Fall 2024之Intercepting Communication(pwn.college)

从构造发送数据包让你更加理解数据包的构成【入门笔记】CSE 365 - Fall 2024之Intercepting Communication(pwn.college) level1 连接到远程主机查看解析 为了知道目标远程主机的ip地址,我们运行`/challenge/run`开启远程主机环境 再使用nc连接到远程主机的特定端口 level…

竹杖芒鞋数模路

“人终将被年少不可得之物困扰一生”——对于我来说,我的年少不可得之物,便是这三个字:“集训队”。当初我来到学校,听说到数模集训队、ACM集训队的时候,我特别特别非常兴奋激动,让我想起了往昔对“集训队”这三个字的无限向往,“集训队”这三个字就是那么吸引我。“人终…

跟着禹神学前端——CSS 基础 (2)

1. CSS 长度单位px:像素 em:相对元素 font-size 的倍数 rem:相对根字体大小的倍数,html 标签就是根。 %:相对父元素计算的百分比。CSS中设置长度,必须加单位,否则样式无效。2. 元素的显示模式块元素(block)又称:块级元素 特点:在页面中独占一行,不会与任何元素共用…

网易云课堂上买的课程过期了怎么办?教你如何下载到本地永久观看~

前言:很多同学都遇到过购买的网课课程过期了,然后无法观看,花了钱还没学完,血亏。这里教大家一种方法,把网易云课堂上面快过期的课程下载到电脑本地,然后可以永久观看,再也不用担心过期了~ 【已经过期的课程也是支持下载的哦!】 提示:操此方法需要用到Windows电脑,Ma…

跟着禹神学前端——CSS 基础 (1)

CSS (Cascading Style Sheets,层叠样式表),是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言,CSS 文件扩展名为 .css1. CSS 简介CSS 的全称为:层叠样式表(Cascading Style Sheets)。 CSS 也是一种标记语言。用于给 HTML 结…

xFormers pip 安装

最近复现的一些仓库用 xFormers 的很多,在 arm 的 aarch64 下安装所有和 CUDA 相关的库都不是非常方便,这里记录一下。 参考: https://github.com/facebookresearch/xformers https://blog.csdn.net/x1131230123/article/details/139231686 首先要确定版本,xFormers 高度绑…

Vue3 + Vue Cli 搭建项目(详细)

搭建:Vue CLI 5 + Vue 3 + Ant Design Vue 3Vue CLI 5:是vue + 大量的第三方组件; Vue 3:是页面开发基于Vue; Ant Design Vue 3:是基于Vue3的UI组件;关于UI还有CSS的Bootstrap。 1. 本地环境准备 按照NodeJS得到npm,使用npm安装 vue cli(脚手架),使用vue cli创建项目…

[BUG]Cursor Chat功能一直在转圈但是不输出信息

问题描述 时间: 20241031 表现在cursor中输入问题后使用 chat功能, 并不能得到有效回答 cursor版本:解决方案: 使用cursor中的Edit功能绕过chat方法: 我不清楚为什么生效, 但是按照下面这种路径操作确实是解决了问题我是darkchink, 如果有其他疑问或者有想要交流的朋友欢迎加我…