CUDA与TensorRT学习一:并行处理与GPU体系架构
文章目录
- 一、并行处理简介
 - 1)串行介绍
 - 2)并行介绍
 - 3)并行与并发的区别
 - 4)编译器优化课程汇总
 - 5)常见并行处理
 
- 二、GPU并行处理
 - 1)基础概念介绍
 - 2)CPU和GPU在并行处理的优化方向
 - 3)CPU的特点及优化方向:
 - 4)总结GPU和CPU的不同
 
- 三、环境搭建
 - 四、CUDA cuDNN TRT版本选择
 - 五、常用软件安装
 - 六、服务器的环境配置
 - 七、编辑器的环境配置
 
一、并行处理简介
1)串行介绍
-  
串行处理的介绍(Sequential processing)
①指令/代码块依次执行
②前一条指令执行结束以后才能执行下一条语句
③一般来说,当程序有数据以来或分支等这些情况下需要窜行执行 -  
例子

 -  
数据依赖的种类(data dependency)
①flow dependency:例如上面的左图
②anti dependency
③output dependency
④control dependency -  
串行使用场景
①复杂的逻辑计算(比如:操作系统)

 -  
并行与串行的效果
①串行需要46cycles


②并行只需要20cycles

进一步优化,st3可以分割为4个子代码执行

再进一步优化,在st4彻底结束之前就知道结束结果了

 -  
总结策略
①先把各个步骤打散到各个core执行(schedule调度)
②把大的loop循环分割成多个小代码,分配到各个core执行(loop optimization)
③在一个指令彻底执行完之前,如果已经得到了想要的数值,可以提前执行下一个指令(pipleline 流水线) 
2)并行介绍
-  
特点
①指令/代码块同时执行
②充分利用multi-core,多核去完成一个或多个任务
③使用场景:科学计算、图像处理、深度学习等等 -  
重点讲解(loop parallelization 循环并行处理)
①大部分时间长的程序,很多都是浪费在I/O内存读写消耗上,要不然就是在loop上,所以并行优化loop是很重要的一个策略
②策略比如说:前/后处理
-resize,crop,blur,bgr2rgb,rgb2gray,dbscan,findCounters
③再比如说:DNN中的卷积(convolution layer)以及全连接层(fully connected layer)
③根据不同语言的ordering

tiling是16x16的数组,或有的以行或列存储

④涉及到DNN或图片处理的时候

 
3)并行与并发的区别


4)编译器优化课程汇总
①编译器自动化并行优化:GCC, LLVL, TVM
 ②针对for循环的并行优化:tile,fuse,split,vectorization。。。
 ③计算图优化:CFG,HTG,MTG
 ④数据流:dataflow compiler,data flow architecture
 ⑤polyhedral:polyhedral compiler
 ⑥HPC:高性能计算
5)常见并行处理

二、GPU并行处理
1)基础概念介绍
1、latency:完成一个指令所需要的时间
 2、memory latency:
 -GPU/CPU 从memory获取数据所需要的等待时间
 -CPU并行处理的优化主要方向
 3、throughput吞吐量
 -单位时间内可以执行的指令数
 -GPU并行处理的优化的主要方向
 4、multi-threading
 -多线程处理
 5、memory latency是什么?
- 总体布局

 - 目的:尽量做到想要的数据就在cache缓存里面,这样就不用在内存也就是Main Memory里面去寻找(也就是
访问下级memory),这时候是很耗费时间的,等待数据的状态就叫stall 

 6、内存总体布局:
 
2)CPU和GPU在并行处理的优化方向
- 方向不同
1)CPU:目标在减少memory latency
2)GPU:目标在于提高throughput CPU是怎么优化的?
①Pipeline:流水线处理,提高throughput的一种优化
②cache hierarchay:多级缓存
③Pre-fetch:提前获取数据
④Branch-predition:预测分支
⑤Multi-threading:多线程计算
①【pipeline】:
 
 优化后4个指令一起执行
 
 ②【cache hierarchay】:多级缓存(在内存前面放多个cache)
 
 ③【pre-fetch】:减少memory latency的一种策略,提前去取数据,也叫hiding memory latency

 提前读取A和B,再串行计算
④【branch-prediction】:分支预测,根据以往的branch走向,去预测下一次branch的走向
 
 若前100次内,每次都是true,那么就可以预测都是true
 ⑤【multi-thread】:多线程
 
- CPU优化总结

 - CPU运算带来的不好地方
①原因:由于CPU处理都是复杂逻辑的计算,有大量分支难以预测分支方向,所以增加线程数带来throughput的收益往往不是那么高
②方法:所以去掉复杂的逻辑计算和分支,把大量简单运算放一起,就可以最大化的提高throughput 
3)CPU的特点及优化方向:
- 特点
①multi-threading技术
②大量core,可以支持大量的线程,
CPU并行处理的threads数量规模,数十个;而GPU并行处理的threads数量是数千个
③每一个core负责的运算逻辑很简单 
- CUDA core:
D = A * B+ C - Tensor core: 4x4x4的matrix calculation ; D = A * B+ C


而更强的444,一次就可以运算跟多

④SIMT(一条指令管理一条数据,thread之间用warp调度)

 
⑤由于throught吞吐量很高,所以对于内存未命中带来的latency对性能的影响很小
 ⑥由于GPU负责的任务是大规模计算(图像处理、深度学习等),所以一旦fetch好了数据以后,就会一直连续处理,并且很少miss
4)总结GPU和CPU的不同

三、环境搭建
①查看是否有GPU
 ②查看linux版本
 ③根据需求找tensorRT的版本
 ④从tensorRT的release note寻求对应的CUDA和cuDNN版本
 ⑤安装CUDA(注意,这里建议从官方提供的脚本安装,不要apt-get)
 ⑥安装cuDNN(看官方的文档)
 ⑦配置TensorRT的路径
 ⑧参考opencv官方文档安装opencv4.5.2
 ⑨安装其他便于开发的软件包
