CUDA软件架构
1.CUDA软件基础架构
2.模型训练/推理场景下的CUDA软件架构
3.CUDA线程模型
3.1 线程模型图
3.2 如何组织线程
层级 | 组成关系 | 核心功能 |
---|---|---|
线程 | 最小执行单元 | 执行单一指令 |
线程束 | 32线程 = 1线程束 | GPU调度单位 |
线程块 | N线程束 = 1块 | 共享内存,块内线程协作 |
网格 | M线程块 = 1网格 | 管理全部计算任务 |
4.CUDA内存模型
4.1 内存模型图
GPU内存使用
内存类型 | 物理位置 | 作用域 | 生命周期 | 使用场景 | 使用方式 | 访问速度 | 容量 |
---|---|---|---|---|---|---|---|
寄存器 | GPU核心 | 单个线程 | 线程生命周期 | 线程私有变量、循环索引、临时计算结果 | 自动分配(声明局部变量) 例: int local_var = 0; | ★★★★★ (最快) | 每线程约256个 |
本地内存 | 显存 (DRAM) | 单个线程 | 线程生命周期 | 大型结构体/数组、寄存器溢出备用空间 | 自动分配(寄存器不足时) 例: float large_array[1000]; | ★★☆ | 受显存限制 |
共享内存 | GPU芯片 (SRAM) | 线程块内所有线程 | 块生命周期 | 块内线程通信、数据复用 | 用 __shared__ 声明例: __shared__ float s_data[32]; 需同步: __syncthreads() | ★★★★☆ | 每SM约100KB |
常量内存 | 显存 (DRAM) | 全局 | 应用生命周期 | 只读常量(如数学常数、配置参数) | 用 __constant__ 声明主机端用 cudaMemcpyToSymbol 复制数据 | ★★★☆ (缓存加速) | 64 KB |
纹理内存 | 显存 (DRAM) | 全局 | 应用生命周期 | 图像处理、空间局部性访问、插值计算 | 通过纹理对象绑定 例: texture<float, 2> tex; 读取: tex2D(tex, x, y) | ★★★★ (缓存优化) | 受显存限制 |
全局内存 | 显存 (DRAM) | 全局 | 应用生命周期 | 主数据存储、跨块通信 | 用 cudaMalloc 分配例: float *d_array; cudaMalloc(&d_array, size); | ★★☆ (最慢) | 主显存容量 (GB级) |
L1/L2缓存 | GPU芯片 (SRAM) | 全局 | 硬件自动管理 | 自动缓存全局/本地内存访问热点 | 自动启用(可通过编译选项调整) 例: -Xptxas -dlcm=ca (L1缓存) | ★★★★☆ | L1: 128KB/SM L2: 共享 (MB级) |
版权申明
本文系作者 @kelixier 原创发布在天策卫的个人技术博客站点。未经许可,禁止转载。
暂无评论数据