Nvidia CUDA初级教程4 GPU体系架构概述
视频:https://www.bilibili.com/video/BV1kx411m7Fk?p=5本节内容:
讲师:周斌
- 为什么需要GPU
- 三种方法提升GPU的处理速度
- 实际GPU的设计举例:
- NVDIA GTX 480: Fermi
- NVDIA GTX 680: Kepler
- GPU存储器设计
- FLOPS - Floating-point OPerations per Second
- GFLOPS - One billion (10e9) FLOPS
- TFLOPS - 1000GFLOPS
- 应用的需求越来越高
- 计算机技术由应用驱动 Application Driven
- 石油勘探
- 气象预报
- …
GPU是一个异构的多处理器芯片,为图形图像处理优化
文章图片
执行单元 Execute Shader
文章图片
CPU类型的内核
文章图片
可以看到,在常规的CPU类型的芯片中,真正进行运算的部分(左侧)所占的面积并不大,而是大缓存和上节提到的乱序执行控制逻辑、分支预测器等优化部分占了很大一部分面积。
思路1:精简、减肥 移除掉那些来帮助单个指令流执行的更快的组件。
两个核,同时执行两个程序片元
文章图片
16个核,同时执行16个程序片元
文章图片
指令流共享:多个程序片元共享指令流。因为如果要执行不同的指令流的话,就需要复杂的控制机构。
思路二:增加ALU,SIMD
文章图片
- 处理单元ALU改进
- 指令变化
- 多数据并行
文章图片
这16路可以共享相同的指令流,也可以不共享。
注意:
- SIMD处理并不总是需要显式的SIMD指令:
- 选项一:显式的向量运算指令
- SSE等
- 选项二:标量指令,但是硬件进行矢量化
- 硬件进行指令流共享
- NVIDIA等架构
- 多个片元共享指令流
- 选项一:显式的向量运算指令
文章图片
由于共享相同的指令流,故按照根据逻辑,某些数据在分支被执行时,另一些在其他分支的数据只能等待。因为它们共享指令流,同一时间必须做相同的事情。
停滞怎么办? 指令有时需要等待其依赖的数据
思路三:片元切换,掩藏延迟 上面提到,很多时候(如分支处理、停滞等),会出现大量片元等待的情况,这无疑会大大降低效率。对此,我们有思路三:
- 大量的独立片元相互切换
- 通过偏远切换来掩藏延迟
获得较高的吞吐 throughput。
上下文存储空间
文章图片
18个小的上下文:更好的延迟掩藏的效果
文章图片
12个中等大小的上下文
文章图片
四个大的上下文:延迟隐藏效果较差
文章图片
每个上下文更大,但是延迟隐藏能力较差
注意:
- 上下文切换可以使软件管理也可以是硬件管理,也可以是结合管理。
根据上面的三个思路,我们得到了一种芯片设计:
文章图片
- 16个核
- 每个核8个乘加ALU
- 16个同时指令流
- 64路并发指令流
- 512 (16*4*8) 个并发程序片元
- 256GFLOPS,1GHz
- 保留每个核的计算部分,将其他部分尽量移除
- 将每个核填满 ALU (通过共享指令流)
- 选项1:显式的 SIMD 向量指令
- 选项2:隐式的共享,由硬件管理
- 通过在多组任务间切换避免停滞
…
Kepler架构
…
存储和数据访问 CPU类型的缓存
文章图片
CPU通常会有多级缓存
GPU型的吞吐处理核
GPU中有更多的ALU,没有传统的分级缓存,需要更高的带宽
文章图片
带宽是非常宝贵的资源
减少带宽需求
- 减少不必要的数据请求,做更多的计算
- 每次访存多取数据,从而减少访存次数
文章图片
总结 GPU的特点
GPU是异构、众核的处理器
【GPU|Nvidia CUDA初级教程4 GPU体系架构概述】针对吞吐优化
高效的GPU任务具备的条件
- 具有成千上万的独立工作
- 尽量利用大量的ALU单元
- 大量的片元切换掩藏延迟
- 可以共享指令流
- 适用于 SIMD
- 最好是计算密集的任务
- 通信和计算的开销比例合适
- 不要受制于访存带宽
推荐阅读
- GPU|Nvidia CUDA初级教程1 CPU体系架构综述
- CUDA|Opencv调用GPU模块
- 机器学习|windows环境下安装TensorRT 5.0教程(win10)
- pytorch-gpu|Linux-Anaconda虚拟环境 安装配置GPU版本Pytorch 流程+遇到与解决问题小结
- GPU|CUDA环境详解
- Python|CUDA的下载与安装
- 安装|深度学习环境配置Win10+CUDA+cuDNN+Tensorflow2.0+PyTorch1.2+Python3.7.6
- 前沿技术|CUDA优化之PReLU性能调优
- linux|linux+ros安装及配置