当前位置: 首页 > article >正文

CUDA与TensorRT学习一:并行处理与GPU体系架构

文章目录

    • 一、并行处理简介
      • 1)串行介绍
      • 2)并行介绍
      • 3)并行与并发的区别
      • 4)编译器优化课程汇总
      • 5)常见并行处理
    • 二、GPU并行处理
      • 1)基础概念介绍
      • 2)CPU和GPU在并行处理的优化方向
      • 3)CPU的特点及优化方向:
      • 4)总结GPU和CPU的不同
    • 三、环境搭建
    • 四、CUDA cuDNN TRT版本选择
      • 1)编辑ssh配置
      • 2)查看GPU黄金二查看ubuntu系统
      • 3)下载trt并安装CUDA
      • 4)在下载cuDNN
    • 五、常用软件安装
    • 六、服务器的环境配置
    • 七、编辑器的环境配置

一、并行处理简介

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
⑨安装其他便于开发的软件包

四、CUDA cuDNN TRT版本选择

1)编辑ssh配置

forward主要远程连接服务器显示图片还是很好用的,IdentityFile主要用于免密码登录

Host station
	HostName 192.168.11.2
	User kalfazed
	ForwardAgent yes      
	ForawrdX11Trusted yes
	ForwardX11 yes
	IdentityFile ~/ssh/macbook
Host container
	HostName 192.168.11.2
	User trt
	ForwardAgent yes      
	ForawrdX11Trusted yes
	ForwardX11 yes
	IdentityFile ~/ssh/macbook
	Port 8090

进入服务器(服务器是ubuntu 22.04.2 LTS Linux 5.19.0)

ssh station

2)查看GPU黄金二查看ubuntu系统

在这里插入图片描述

lspci | grep VGA

查看ubuntu系统

lsb_release -a

在这里插入图片描述
查看显卡驱动信息,包括可兼容的最大cuda版本,核占用率,显卡内存

nvidia-smi  

在这里插入图片描述

3)下载trt并安装CUDA

去trt官方根据cuda兼容版本下载trt
在这里插入图片描述
再下对应cuda,尽量用最新的比如11.7
在这里插入图片描述
并选择对应平台,后面选runfile
在这里插入图片描述
然后官网提供安装
在这里插入图片描述
安装完后在/usr/local下面可以看到cuda版本

在这里插入图片描述

4)在下载cuDNN

可以看到8.5.1对应的版本的是cuDNN8.6.0
在这里插入图片描述
下载cuDNN 8.6.0
在这里插入图片描述
官网也有cuDNN的安装流程
①安装对应N卡显卡驱动
②装对应CUDA,但是我们已经在上面步骤安装了
③装zlib

ubuntu:
sudo apt-get install zlib1g
or
for rhel users,
sudo yum install zlib

④解压然后拷贝
在这里插入图片描述
⑤按照所需安装cuda,这里是显卡driver我已经安装了
在这里插入图片描述
安装cuda结束后可以查看版本(想要11.7再修改软连接)
在这里插入图片描述
fish或bash指定tensorRT的目录到系统环境配置里面
在这里插入图片描述
查看trt有没有执行成功(trtexec :把模型转化为trt能识别的模样)
在这里插入图片描述
可以进到某个samples目录下执行make,目标文件就放入到bin
在这里插入图片描述
比如执行./sample_onnx_mnist --fp16(–fp16是模型量化,推理速度会更快)
在这里插入图片描述
根据图片识别这个数字是几,可以看到推理是4
在这里插入图片描述

五、常用软件安装

六、服务器的环境配置

七、编辑器的环境配置


http://www.kler.cn/news/289296.html

相关文章:

  • 名城优企游学活动走进龙腾半导体:CRM助力构建营销服全流程体系
  • nginx部署前段VUE项目
  • wsl2 无法上网解决方法
  • 文本文件完整性判断-加密
  • Python中排序算法之冒泡排序
  • Soul Machines——AI生成虚拟主播或虚拟人,模拟真人交互
  • 后端MVC三层架构,Mybatis ,雪花算法生成唯一id
  • 『功能项目』销毁怪物蛋的Shaders消融特效【17】
  • SpringDataJPA系列(5)@Query应该怎么用?
  • QT connect的使用
  • 算法练习题11:单词出现次数
  • Android kotlin使用Netty网络框架实践(客户端、服务端)
  • 新版Pycharm的Available Packages里面为空,新版没有Manage Repositories功能,如何解决
  • OpenGL/GLUT实践:弹簧-质量-阻尼系统模拟摆动的绳子和布料的物理行为(电子科技大学信软图形与动画Ⅱ实验)
  • 《React Hooks:让你的组件更灵活》
  • Android之电量优化
  • 【论文笔记】Multi-Task Learning as a Bargaining Game
  • 4.3 python 编辑单元格
  • 惠中科技:开启综合光伏清洗新征程
  • 文件包含所用协议实战
  • sql-labs56-60通关攻略
  • 设计模式结构型模式之适配器模式
  • vue3子组件修改父组件传来的值
  • 普元Devops-在云主机上拉取harbor的docker镜像并部署
  • 2017年系统架构师案例分析试题五
  • JVM理论篇(一)
  • Flask的secret_key作用
  • Nginx负载均衡数据流分析
  • ES6 类-总结
  • C#——扩展方法