GPU编程初探

GPU(Graphic Processing Unit),图像处理处理器,俗称显卡,主要处理图像、显示等任务(数据运算

CPU逻辑运算

GPGPU(General Purpose computing on Graphic Processing Unit ),通用GPU,主要处理通用计算任务。

GPU性能指标

  1. 核心数
  2. GPU显存容量
  3. GPU计算峰值
  4. 显存带宽

CPU与GPU架构差异

CPU+GPU异构架构

GPU不能单独计算,CPU+GPU组成异构计算架构;

CPU起到控制作用,一般称为主机(Host);

GPU可以看作CPU的协处理器,一般称为设备(Device);

主机和设备之间内存访问一般通过PCLe总线链接;

NVIDIA GPGPU发展历史

Tesla 架构

  1. 代表性GPU:G80、G200
  2. 第一款支持CUDA的GPGPU
  3. 第一款使用标量线程处理器的GPU
  4. 首次引入了单指令多线程(SIMT)执行模型,多个线程使用一条指令并发执行
  5. 首次引入共享内存,可编程Cache,线程间通信

 

Fermi 架构(Compte Capability 2.0,2.1)

  1. 代表性GPU:C2050、C2070
  2. 第一款真正支持通用计算的GPU
  3. 提高双精度性能、ECC支持
  4. Ture Cach Hierarchy
  5. 共享内存与L1 Cache 可配置
  6. 大幅提升双精度性能
  7. 我国的天河1A超算,采用了C2050 GPU,全球首台采用异构架构的超算,开启异构计算时代

 

 

 Kepler 架构(Compte Capability 3.0~3.7)

  1. 代表性GPU:K20、K40、K80
  2. 引入DP Unit,双精度性能首次超过1T Flops
  3. 减少SM(SMX)数量
  4. 大幅增加每个SMX中的CUDA Core数量
  5. 192个CUDA Core+64个DP+32个SFU
  6. 美国橡树岭国家实验室超级计算系统Titan采用了Kepler架构的GPU
  7. 进军科学计算的雄心 

 Maxwell 架构(Compte Capability 5.0~5.3)

  1. 代表性GPU:Tegra TX1
  2. 去除DP Unit,追求功效比
  3. 将SMM内的CUDA Core进行分组,每组有专用的指令调度单元
  4. SMM内CUDA Core数量减少为128个,方便调度和控制
  5. Tegra TX1 终端高性能ARM+GPU异构计算平台
  6. 尝试进入自动驾驶领域

 

 Pascal 架构(Compte Capability 6.0~6.2)

  1. 代表性GPU:P40、P100
  2. DP Unit 又回来了,重视双精度
  3. SM内进一步精简,但每个GPU包含的SM多了
  4. NVLink横空出世
  5. Global Memory 由GDDR5替换成了HBM2, 带宽大幅增加
  6. 面向深度学习的初步定制:CUDNN
  7. 硬件直接支持FP16

 

 Volta 架构(Compte Capability 7.0~7.2)

  1. 代表性GPU:V100
  2. Tensor Core 来了,深度学习定制
  3. FP32和INT32两组运算单元相互独立,可同时执行一条FP32指令和一条INT32指令
  4. 每个SM单元,4组Process Block
  5. 硬件直接支持FP16
  6. NVIDIA DGX系列AI超级计算机横空出世

 

 

Turing 架构(Compte Capability 7.5)

  1. 代表性GPU:T4
  2. Volta架构的小加强
  3. 增加了Int8/Int4的推理能力
  4. 去除了FP64,深度学习方面专注推理
  5. LD/ST砍半
  6. 提升管线渲染
  7. 增加TR Core,增强光线追踪能力

 

 Ampere 架构(Compte Capability 8.0)

  1. 代表性GPU:A100
  2. 主要改进是Tensor Core,在深度学习的道路上越走越深
  3. 增强了Tensor Core中混合精度FMA指令的计算能力,由每个时钟周期执行64个FMA提升到每个时钟周期执行256个FMA
  4. Tensor可支持的数据类型扩展到了FP16、BF16、TF32、FP64、INT8、INT4等数据类型
  5. 增加结构化稀疏运算能力

 

GPU硬件抽象

大规模细粒度并行处理器(众核)

层次化的硬件架构:

GPU -> SM(SMX、SMM)->PE(CUDA Core, FP32/FP64)

层次化的内存组织形式:

全局内存(Global Memory)->共享内存(Shared Memory)->私有内存(寄存器)

线程组织

层次化的线程组织形式:

Grid->Block->Thread

线程索引(dim3)

Local_id: (threadIdx.x, theadIdx.y)

Block_id: (blockIdx.x, blockIdx.y)

Block_dim:(blockDim.x, blockDim.y)

Global_id:

X: blockIdx.x * blockDim.x + threadIdx.x

Y:blockidx.y * blcokDim.y + theadIdx.y

线程开启数量和线程组织方式由用户决定

线程与硬件的映射

  • 每个Thread都有自己的私有内存(寄存器)
  • 同属于一个Block内的所有Thread可通过共享内存(sharead memory)进行通信
  • 同属于一个Grid内的所有Thread可通过全局内存进行通信

异构编程

异构计算系统:

  • Host(主机端): CPU
  • Device(设备端): GPU

异构计算程序:

  • 始于Host,终于Host:Device程序由Host端开启,Device完成计算任务后,将计算结果传回Host端。
  • Host和Devie可以并行执行不同计算程序

 

 CPU与GPU之间的数据传输

  1. 独立GPU:CPU内存和GPU内存相互独立且分离
  2. Host端除执行一般C语言程序的内存分配外,还需执行如下操作:
  • 分配设备内存:cudaMalloc
  • 执行Host与Device间的数据传输: cudaMemcpy

 

CUDA程序组成

Host端程序(管理者)

  • 运行在CPU
  • 内存管理、Host与Device间通信、任务管理

Device端程序(工人)

  • 运行在GPU
  • 计算任务

编译:NVCC编译器

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Polaris北极星少女

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值