当前位置:网站首页>浅谈GPU:历史发展,架构
浅谈GPU:历史发展,架构
2022-06-27 06:11:00 【honky-tonk_man】
GPU历史
要将GPU当然要从CPU开始说起,CPU在设计之初并没有规定特定的workload,而是假设所有的workload都会发生在CPU上,所以CPU的设计目的是为了“通用(generalists)”各种工作场景
我们都知道CPU有流水线,但是,CPU的设计者都尽量的将CPU的流水线设计的短一点,对于每一个指令在CPU流水线中有着以下的步骤
- 从内存中load 指令给CPU(此时指令的地址或者叫做指针已经在PC中)
- CPU解码指令,并且根据指令从寄存器中得到对应的操作数,这个操作数是我们指令需要用到的
- CPU执行指令,CPU用ALU执行指令
- 假如指令是关于内存的,我们要读或者写内存的数据
- 将指令执行的结果写回寄存器
假设我们有以下的一段伪代码
a := b+c
if a == 0 then
do this...
else
do that:
endif
我们看上面的伪代码有非常多的分支,首先我们肯定是执行第一个IF指令,当我们的IF指令执行到CPu流水线的第二阶段解码阶段,我们按照CPU流水线的设计load第二个条指令到CPU流水线的第一个阶段中,但是我们第一个指令的结果还没出来,我们不知道是load then后面的指令还是load,else后面的指令…此时CPU会进行一个guess,就是随机选一个分支进行load,如果对了完事大吉继续执行,如果错了就清除之前的流水线中的指令然后load正确的分支指令重新进入流水线,所以CPU的流水线不易做的特别长,假如发生了分支预测失败,我们需要在流水线中清除的指令实在太多
FPU
历史上FPU总是作为一个coprocessor对于CPU来说(一般是集成在CPU中),FPU一般不会自己运行,只有到CPU进行浮点数运算的时候才会使用FPU进行计算
为什么CPU不进行浮点数运算,而是交给FPU呢?因为CPU进行浮点数运算非常慢,为什么CPU执行浮点数这么慢?因为浮点数和整数相比不是按照“常规”存储,浮点数存储一般分为3个部分,分别为符号位(代表浮点数的正负),指数位,位数,比如-161.875,首先为负所以第一个符号位为1,然后我们将161.875化成二进制161的二进制为10100001,875的二进制为1101101011,和一起为10100001.1101101011,但是浮点数的指数位只有8位
而我们的cpu在读取float的时候会先取值再解析才能组成最终的float值,和int不一样,
GPU
说了FPU那么和我们GPU有什么关系?要知道GPU是用来并行的做大量浮点数运算,因为GPU需要处理非常多相同指令不同数据的操作,所以GPU用SIMD(single instructtion multiple data)设计了一个非常长的流水线
GPU架构
首先对比GPU和CPU
CPU在延迟方面做了非常大的优化,其目的是为了快速运行程序,尽可能的减少延迟,尽可能快的切换到其他的进程做优化
而GPU是对吞吐量做了优化,其单核执行效率可能没有CPU单核厉害,但是其核心数非常多,意味着同一时间接收的任务或者进程数量也非常多,接收进程数量多也意味着吞吐量非常大
我们先看现代CPU的架构
通过上图架构我们知道CPU频繁的使用cache去降低延迟(要知道cache要比内存快得多)
每一个core都有二个一级缓存和一个二级缓存,每一个核的2个一级缓存分别是数据缓存核指令缓存,而他们共享的二级缓存空间比一级缓存更大(当然从速度角度上将二级缓存比一级缓存更慢)
最后每个核都共享三级缓存(三级缓存比二级缓存空间更大,速度更慢),最后就脱离CPU的范畴,比如主存
我们再看GPU架构

和CPU每一个core都有两级缓存相比,GPU的缓存使用就少了很多,其延迟当然也比CPU大不少
从上图得出
一个GPU由多个processor cluster组成(上图就画了四个虽然他标个n)
一个processor cluster由多个Streaming Multiprocessors组成
一个Streaming Multiprocessors里面可能包含多个core,从上图得出Streaming Multiprocessors中一定数量的core共享一级缓存,多个Streaming Multiprocessors共享二级缓存
至此GPU上就没缓存了,其他的就是GPU上插的板载内存(貌似不可拆卸)这个板载内存一般都比较新,比如上图就用了DDR5的内存
程序从CPU到GPU之间需要用PCIE总线去传输数据,这个是非常慢的,假如我们有大量的数据需要GPU执行这个传输可能就是瓶颈
我们的一个服务器可能插多个GPU,英伟达的GPU之间可以通过特殊的方式进行数据传输,比如NVlink,其速率是PCIE的几百倍…
边栏推荐
- Multithreading basic Part3
- KubeSphere 集群配置 NFS 存储解决方案-收藏版
- Inter thread wait and wake-up mechanism, singleton mode, blocking queue, timer
- 427-二叉树(617.合并二叉树、700.二叉搜索树中的搜索、98. 验证二叉搜索树、530.二叉搜索树的最小绝对差)
- 【QT小点】QT下载链接
- 下载cuda和cudnn
- yaml文件加密
- Built in functions of spark
- Assembly language - Wang Shuang Chapter 13 int instruction - Notes
- Jump details of item -h5 list, and realize the function of not refreshing when backing up, and refreshing when modifying data (record scroll bar)
猜你喜欢

30 SCM common problems and solutions!

Multithreading basic part part 1

汇编语言-王爽 第9章 转移指令的原理-笔记

函数栈帧的形成与释放

免费的 SSH 和 Telnet 客户端PuTTY

Active learning

机 器 学 习

Distribution gaussienne, régression linéaire, régression logistique

Crawler learning 5--- anti crawling identification picture verification code (ddddocr and pyteseract measured effect)

cpu-z中如何查看内存的频率和内存插槽的个数?
随机推荐
古典密码体制--代换和置换
The SCP command is used in the expect script. The perfect solution to the problem that the SCP command in the expect script cannot obtain the value
[collection] Introduction to basic knowledge of point cloud and functions of point cloud catalyst software
Download CUDA and cudnn
426 binary tree (513. find the value in the lower left corner of the tree, 112. sum of paths, 106. construct a binary tree from the middle order and post order traversal sequence, 654. maximum binary
TiDB的使用限制
线程间等待与唤醒机制、单例模式、阻塞队列、定时器
Us camera cloud service scheme: designed for lightweight video production scenes
Yaml file encryption
Run opcua protocol demo on raspberry pie 4B to access kubeedge
Spark's projection
Altium designer 19 device silk screen label position shall be placed uniformly in batches
多线程基础部分Part3
Create a basic WDM driver and use MFC to call the driver
cpu-z中如何查看内存的频率和内存插槽的个数?
卷积神经网络---CNN模型的应用(找矿预测)
美摄云服务方案:专为轻量化视频制作场景打造
js实现双向数据绑定
Multithreading basic part2
Kubesphere cluster configuration NFS storage solution - favorite