这是 CUDA/GPU 计算领域的一个高频易混概念问题。我们来详细区分:


1. Shared memory(共享内存)

  • 定义
    在CUDA等GPU编程中,Shared memory专指每个线程块(Block)内部所有线程独享的高速片上内存
  • 范围/特性
    • 作用范围(Scope):仅同一个Block内的线程可见与读写,不同Block间不共享
    • 访问速度:极快,接近寄存器速度,远快于全局内存(global memory)。
    • 容量有限:每个SM(流处理器组)通常只有48kB或更大一点(具体随硬件)。
    • 典型用途:线程协作、数据缓存、矩阵块操作、并行归约等 Block 内部的高效并行数据交换。
  • 声明
    1
    __shared__ float buf[256];
  • 同步:需手动使用__syncthreads()同步线程对shared memory的访问。

2. Unified memory(统一内存)

  • 定义
    Unified memory 是NVIDIA CUDA从Kepler架构开始引入的一种机制,它让CPU和GPU共享一块统一逻辑地址空间(Unified Virtual Address Space, UVA)。
  • 范围/特性
    • 作用范围:CPU 和 GPU 都能直接访问这块内存,开发者不需要手动区分主机内存和设备内存
    • 底层实现:物理上主机(CPU)和GPU的内存还是独立的,“统一”是编程角度,数据会根据需要在二者之间自动迁移。
    • 用法简便:分配统一内存用cudaMallocManaged,不再需要单独的cudaMemcpy
    • 性能影响:自动迁移方便开发,但可能带来额外的访问延迟(比如数据在GPU需要时还在CPU,需迁移才可用)。
  • 代码示例
    1
    2
    float *A;
    cudaMallocManaged(&A, N * sizeof(float));
  • 优势:简化了多台CPU-GPU混合计算下的数据管理,可让数据“到处都能访问”,无需手动“拷来拷去”。

总结对比

Shared Memory Unified Memory
存在位置 GPU片上(每个Block独享) 由CUDA管理的CPU/GPU统一虚拟空间
可访问范围 仅Block内部线程 所有CPU进程和所有GPU线程
用途/意义 Block内部线程高速协同/缓存 开发便捷,自动跨主机与设备迁移数据
分配与声明 内核内 __shared__ 声明 cudaMallocManaged 分配
速度 极快 与实际物理存储一致(访存+迁移延迟)
开发范式 需显式声明、手动同步 无需memcpy,后台隐式同步和迁移
典型适用 并行算法块内优化(如矩阵乘) 跨设备协同开发、方便调试和原型开发

一句话区分

  • Shared memory线程块内部临时高速协作区
  • Unified memoryCPU与GPU共享访问的自动同步全局内存区,开发角度“无缝”,但速度不如片上shared快。

如需更细节的原理说明、典型应用区别或代码示例,可以继续提问!