问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

GPU架构与CUDA编程模型详解

创作时间:
作者:
@小白创作中心

GPU架构与CUDA编程模型详解

引用
CSDN
1.
https://blog.csdn.net/qq_64091900/article/details/143472200

随着人工智能和高性能计算的快速发展,GPU(图形处理器)和CUDA(Compute Unified Device Architecture)编程模型已成为重要的技术基础。本文将详细介绍GPU的体系结构和CUDA编程模型,帮助读者深入理解GPU的工作原理和编程方法。

GPU架构与CUDA编程模型

1. GPU体系结构

1.1 计算单元组织架构

结构
功能
CUDA核心
类似ALU(算术逻辑单元),但远不如CPU灵活,可执行浮点运算/张量运算/光线追踪(高级核心)
Warp
多核心共用一个取指/译码器,按SIMT(单指令多线程)工作(所有线程指令相同/数据可不同)
SM(流式多处理器)
包含多组Warps,所有CUDA核心共用一套执行上下文(缓存)&共享内存

1.2 存储层次架构

  1. 不同SM能够访问相同的L2 Cache
  2. 显存与缓存之间的带宽极高,但是相比GPU的运算能力仍然有瓶颈

2. CUDA编程模型

2.1 CUDA程序简述

  1. CUDA程序的两部分
程序
运行位置
主要职责
Host程序
CPU
任务管理/数据传输/启动GPU内核
Device程序
GPU
执行内核/处理数据
  1. Kernel即在GPU上运行的函数,如下简单内核定义示例
//通过__global__关键字声明内核函数
__global__ void VecAdd(float* A, float* B, float* C)
{
   int i = threadIdx.x;
   C[i] = A[i] + B[i];
}
int main()
{
   //通过<<<...>>>中参数指定执行kernel的CUDA thread数量
   VecAdd<<<1, N>>>(A, B, C); 
}

2.2 线程并行执行架构

  1. 线程层次
结构
地位
功能
Thread
并行执行最小单元
执行Kernel的一段代码
Warp(32Threads)
线程调度的基本单位
所有线程以SIMD方式执行相同指令
Block
GPU执行线程基本单位
使块内线程内存共享/指令同步
Grid
并行执行的最大单元
执行整个内核(启动内核时必启动整个Grid)
  1. 线程在计算单元的映射:线程层次↔ 层次对应 GPU

  • 注意SM和Block不必1v1对应也可Nv1对应
  1. 线程在存储单元的映射
线程结构
可Access的内存结构
访问速度
Thread
每线程唯一的Local Memory
极快
Block
每块唯一的Shared Memory(块中每个线程都可访问)
较快
所有线程
唯一且共享的Global Memory
较慢

3. CPU与GPU

3.1 CPU/GPU结构对比

GPU
CPU
ALU
功能强但数量少(只占GPU小部),时钟频率极高
功能弱但数量大,时钟频率低
Cache
容量大并分级,缓存后续访问数据
容量很小,用于提高线程服务
控制
复杂串行逻辑,如流水/分支预测/乱序执行
简单(但大规模)并行逻辑

3.2 CPU ↔ 数据 / 指令传输 PCIe GPU交互

设备
逻辑地位
IO模块
任务分配
GPU
外设
IO Block(南桥)
控制逻辑和任务调度
CPU
主机
Copy Engine
执行大量并行计算任务
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号