惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Cloudbric
Cloudbric
C
CERT Recently Published Vulnerability Notes
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
C
Cisco Blogs
T
Tenable Blog
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
I
Intezer
AWS News Blog
AWS News Blog
IT之家
IT之家
博客园 - 司徒正美
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
The Hacker News
The Hacker News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Spread Privacy
Spread Privacy
S
SegmentFault 最新的问题
博客园 - Franky
人人都是产品经理
人人都是产品经理
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
V
Visual Studio Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
H
Hacker News: Front Page
Latest news
Latest news
Scott Helme
Scott Helme
腾讯CDC
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
A
Arctic Wolf
S
Securelist
雷峰网
雷峰网
The GitHub Blog
The GitHub Blog
Project Zero
Project Zero
Google DeepMind News
Google DeepMind News
P
Palo Alto Networks Blog
F
Fortinet All Blogs
Schneier on Security
Schneier on Security
云风的 BLOG
云风的 BLOG
Security Archives - TechRepublic
Security Archives - TechRepublic
The Last Watchdog
The Last Watchdog
WordPress大学
WordPress大学
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 最新话题
S
Schneier on Security
NISL@THU
NISL@THU
Jina AI
Jina AI
M
MIT News - Artificial intelligence

Пусть этот камень будет более крепким, чем человек

【琐记】烟火与尘埃 【Triton】Triton实现矩阵乘 【LLM推理加速】FlashAttention 【LLM推理加速】PagedAttention 【LLM推理加速】Online Softmax LLM基础知识【1】 Transformer模型 【AI编译】LayerGroup Tiling Tile的疑惑和思考 【AI编译】深度优先的Tile调度,万事大吉? 【AI编译】多级流水线Tile调度策略 【CUDA C++】GPU内存使用【3】 【AI编译】Cache缓存地址映射 【CUDA C++】GPU基本介绍【1】 【00】0序章-不受欢迎的来客 【转载】我来了——持续低熵 【Halide】调度优化【2】 【感想】写作进度报告5 【Halide】调度优化【1】 【转载】北大中文男足战报2 【BYOC】TVM切分子图 【转载】北大中文男足战报1 【AI编译】张量生命周期管理 SystemC 用寄存器同步建模方法 【脉动阵列】脉动阵列类型 【im2col】AScend conv accelerate 【感想】写作进度报告4 【BYOC】TVM添加自定义编译器 ccompiler 【感想】写作进度报告3 【Tengine】推理流程脑图【2】 【Tengine】推理流程脑图【1】 【NCNN】学习ncnn模型转换 【编译器】使用llvm编译自定义语言【3】编译 object 【编译器】使用llvm编译自定义语言【2】转llvm IR 【编译器】使用llvm编译自定义语言【1】构建AST 【AI编译】如何进行内存分配 【感想】写作进度报告2 【AI编译】layer-group之后如何tiling 【AI编译】如何进行layer-group 【量化】连续卷积层首尾量化的可行性 【Gemm】内存对齐 【gemm】Gemm计算加速 【TVM】通过代码学习编译流程【5】FuseOps 【TVM】通过代码学习编译流程【6】CodeGen 【TVM】通过代码学习类【3.5】Pass 【TVM】通过代码学习编译流程【4】BuildRelay 【AI编译】Tiling操作能优化什么时间 【TVM】通过代码学习编译流程【3】模型编译 【TVM】通过代码学习编译流程【2】模型转换 【TVM】通过代码学习编译流程【1】必要知识 【感想】写作进度报告1 【Winograd】卷积加速算法原理及实现 SystemC 等待异步事件解决方案 【TVM】Python脚本实现模型编译和保存 【推理引擎】常见AI推理框架 【3D建模】T110E3卡迪夫蓝调皮肤模型 【TVM】C++部署运行TVM 【推理引擎】NCNN和Tengine量化推理逻辑对比 【3D建模】IS-7攻城锤流纹岩皮肤展示 【TVM】根据例子走通代码库 博客汇总目录 【Im2Col】卷积加速算法【2】NHWC 【Im2Col】卷积加速算法【1】 NCHW openBlas库的安装与简单使用 C语言工程调用Cpp库解决方案 foo Hello World
【CUDA C++】GPU存储【2】
Post author: XianMu@Пусть этот камень будет более крепким, чем ч · 2026-01-16 · via Пусть этот камень будет более крепким, чем человек

# 前言

本篇是介绍 GPU 的存储硬件。资料来源于 官网 CUDA Programming Guide。本文会比官网教程简洁一些,去掉一些我不太感兴趣的内容(任性)。

参考 官网 CUDA Programming Guide

作为初学者,错误在所难免,还望不吝赐教。

# GPU Memory

在现代计算系统中,有效利用内存与最大限度地利用执行计算的逻辑单元同样重要。异构系统拥有多个内存空间,而图形处理器(GPU)除了缓存之外,还包含多种类型的可编程片上内存。

CPU 存储

# Global Memory(全局内存)

  • 物理本质:GPU 芯片外的 DRAM 芯片(即显存,VRAM)
  • 别名:GPU DRAM、Device Memory
  • 访问范围:所有 SM(Streaming Multiprocessors)均可访问
  • 特点:
  • 容量大(如 8GB–24GB)
  • 延迟高,但带宽极高(通过宽总线)
  • 在 CUDA 编程中通过 cudaMalloc () 分配
  • 在架构图中的位置
  • 位于 GPU 芯片外部,通过 Memory Controller 连接到 GPU 核心,通常标注为 "GPU DRAM" 或 "Global Memory"。

# System Memory / Host Memory(系统内存 / 主机内存)

  • 物理本质:CPU 旁边的 DDR4/DDR5 内存条
  • 访问者:CPU 可直接访问;GPU 需通过 PCIe 或 NVLink 访问(速度慢)
  • 在统一虚拟地址空间下:与 GPU 全局内存共用一个地址空间,但物理分离
  • 在架构图中的位置:
    位于 CPU 一侧,通过 PCIe/NVLink 总线连接到 GPU,通常标注为 "SYSTEM DRAM" 或 "Host Memory"。

# On-Chip Memory(片上内存)—— 属于每个 SM

# (a) Register File(寄存器文件)

  • 归属:每个 SM 独有
  • 分配单位:每个线程(thread)
  • 用途:存储线程的局部变量(由编译器自动分配)
  • 特点:
  • 速度最快(零延迟访问)
  • 容量有限(如每个 SM 有 65536 个 32-bit 寄存器)
  • 线程块能否被调度到 SM,取决于寄存器是否够用
  • 在架构图中的位置:
    位于 每个 SM 内部,紧邻 CUDA Core / FP32 ALU,通常标为 "Register File"。
  • 归属:每个 SM 独有
  • 分配单位:每个线程块(thread block)
  • 用途:线程块内线程间通信、数据重用(如矩阵分块)
  • 特点:
  • 速度极快(接近寄存器)
  • 容量小(通常 64KB–164KB per SM),可与 L1 缓存动态划分
  • 程序员显式管理( __shared__ 关键字)
  • 在架构图中的位置:
    位于 SM 内部,与 Register File 并列,常标为 "Shared Memory" 或包含在 "Unified Data Cache" 模块中(因与 L1 共享物理存储)。

# Caches(缓存)

# (a) L1 Cache(一级缓存)

  • 归属:每个 SM 独有
  • 物理实现:与 Shared Memory 共享同一块 SRAM(称为 Unified Data Cache)
  • 用途:缓存 global memory 的数据(可配置为更多 L1 或更多 Shared Memory)
  • 在架构图中的位置:
    通常与 Shared Memory 合并表示为 "Unified Data Cache" 或 "L1/Shared Memory" 模块,位于 SM 内部。

# (b) L2 Cache(二级缓存)

  • 归属:整个 GPU 共享
  • 用途:缓存所有 SM 对 global memory 的访问,减少 DRAM 访问次数
  • 容量:几 MB 到几十 MB(如 RTX 4090 有 72MB L2)
  • 在架构图中的位置:
    位于 所有 SM 之外、GPU DRAM 之前,通常画成一个大的 "L2 Cache" 模块,连接所有 SM 和 Memory Controller。

# (c) Constant Cache(常量缓存)

  • 归属:每个 SM 独有
  • 用途:缓存标记为 __constant__ 的只读数据(如 kernel 参数)
  • 特点:小容量、广播式访问、低延迟
  • 在架构图中的位置:
    通常在 SM 内部单独标出,或作为 L1 之外的一个小模块,标为 "Constant Cache"。

# Unified Memory(统一内存)

  • 注意:这不是一种 “物理内存”,而是一种编程模型 + 硬件 / 运行时支持机制
  • 作用:让 CPU 和 GPU 使用同一个指针访问数据,系统自动迁移数据
  • 底层仍使用:System Memory + Global Memory(物理上仍是两块)
  • 在架构图中:不对应具体硬件模块,但依赖 统一虚拟地址空间(Unified Virtual Addressing, UVA) 和 页迁移引擎(Page Migration Engine),这些通常由 MMU(内存管理单元) 和 IOMMU 支持,在高级架构图中可能不显式画出。

# 总结:

总结图

# 后记

本博客目前以及可预期的将来都不会支持评论功能。各位大侠如若有指教和问题,可以在我的 github 项目 或随便一个项目下提出 issue,并指明哪一篇博客,看到一定及时回复!