OpenGL学习随笔(一)-- CPU和GPU的设计区别

摘要:
CPU需要强大的通用性来处理各种数据类型,而GPU面临的是类型高度统一、相互依赖、不需要中断的纯计算环境的大规模数据。因此,CPU和GPU呈现出非常不同的架构(示意图):CPU具有强大的ALU(算术运算单元),执行双精度浮点源计算的加法和乘法只需1~3个时钟周期。数据转发的逻辑控制单元确定这些指令在流水线中的位置,并尽快将一条指令的结果转发给后续指令。

CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。

于是CPU和GPU就呈现出非常不同的架构(示意图):

OpenGL学习随笔(一)-- CPU和GPU的设计区别第1张
其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元, 绿色的是算术运算单元。


GPU

GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间,而且还有有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分。

OpenGL学习随笔(一)-- CPU和GPU的设计区别第2张

从上图可以看出:
Cache, local memory: CPU > GPU
Threads(线程数): GPU > CPU
Registers: GPU > CPU 多寄存器可以支持非常多的Thread,thread需要用到register,thread数目大,register也必须得跟着很大才行。
SIMD Unit(单指令多数据流,以同步方式,在同一时间内执行同一条指令): GPU > CPU。


CPU

CPU 基于低延时的设计:

OpenGL学习随笔(一)-- CPU和GPU的设计区别第3张

CPU有强大的ALU(算术运算单元),它可以在很少的时钟周期内完成算术计算。
当今的CPU可以达到64bit 双精度。执行双精度浮点源算的加法和乘法只需要1~3个时钟周期。
CPU的时钟周期的频率是非常高的,达到1.532~3gigahertz(千兆HZ, 10的9次方).

大的缓存也可以降低延时。保存很多的数据放在缓存里面,当需要访问的这些数据,只要在之前访问过的,如今直接在缓存里面取即可。

复杂的逻辑控制单元。当程序含有多个分支的时候,它通过提供分支预测的能力来降低延时。

数据转发方面。 当一些指令依赖前面的指令结果时,数据转发的逻辑控制单元决定这些指令在pipeline中的位置并且尽可能快的转发一个指令的结果给后续的指令。这些动作需要很多的对比电路单元和转发电路单元。

OpenGL学习随笔(一)-- CPU和GPU的设计区别第4张

GPU是基于大的吞吐量设计。

GPU的特点是有很多的ALU和很少的cache. 缓存的目的不是保存后面需要访问的数据的,这点和CPU不同,而是为thread提高服务的。如果有很多线程需要访问同一个相同的数据,缓存会合并这些访问,然后再去访问dram(因为需要访问的数据保存在dram中而不是cache里面),获取数据后cache会转发这个数据给对应的线程,这个时候是数据转发的角色。但是由于需要访问dram,自然会带来延时的问题。

GPU的控制单元(左边黄色区域块)可以把多个的访问合并成少的访问。

GPU的虽然有dram延时,却有非常多的ALU和非常多的thread. 为啦平衡内存延时的问题,我们可以中充分利用多的ALU的特性达到一个非常大的吞吐量的效果。尽可能多的分配多的Threads.通常来看GPU ALU会有非常重的pipeline就是因为这样。

所以与CPU擅长逻辑控制,串行的运算。和通用类型数据运算不同,GPU擅长的是大规模并发计算,这也正是密码破解等所需要的。所以GPU除了图像处理,也越来越多的参与到计算当中来。

GPU的工作大部分就是这样,计算量大,但没什么技术含量,而且要重复很多很多次。就像你有个工作需要算几亿次一百以内加减乘除一样,最好的办法就是雇上几十个小学生一起算,一人算一部分,反正这些计算也没什么技术含量,纯粹体力活而已。而CPU就像老教授,积分微分都会算,就是工资高,一个老教授资顶二十个小学生,你要是富士康你雇哪个?GPU就是这样,用很多简单的计算单元去完成大量的计算任务,纯粹的人海战术。这种策略基于一个前提,就是小学生A和小学生B的工作没有什么依赖性,是互相独立的。很多涉及到大量计算的问题基本都有这种特性,比如你说的破解密码,挖矿和很多图形学的计算。这些计算可以分解为多个相同的简单小任务,每个任务就可以分给一个小学生去做。但还有一些任务涉及到“流”的问题。比如你去相亲,双方看着顺眼才能继续发展。总不能你这边还没见面呢,那边找人把证都给领了。这种比较复杂的问题都是CPU来做的。


总而言之

CPU和GPU因为最初用来处理的任务就不同,所以设计上有不小的区别。而某些任务和GPU最初用来解决的问题比较相似,所以用GPU来算了。GPU的运算速度取决于雇了多少小学生,CPU的运算速度取决于请了多么厉害的教授。教授处理复杂任务的能力是碾压小学生的,但是对于没那么复杂的任务,还是顶不住人多。当然现在的GPU也能做一些稍微复杂的工作了,相当于升级成初中生高中生的水平。但还需要CPU来把数据喂到嘴边才能开始干活,究竟还是靠CPU来管的。


什么类型的程序适合在GPU上运行?

  (1)计算密集型的程序。所谓计算密集型(Compute-intensive)的程序,就是其大部分运行时间花在了寄存器运算上,寄存器的速度和处理器的速度相当,从寄存器读写数据几乎没有延时。可以做一下对比,读内存的延迟大概是几百个时钟周期;读硬盘的速度就不说了,即便是SSD, 也实在是太慢了。

  (2)易于并行的程序。GPU其实是一种SIMD(Single Instruction Multiple Data)架构, 他有成百上千个核,每一个核在同一时间最好能做同样的事情。

免责声明:文章转载自《OpenGL学习随笔(一)-- CPU和GPU的设计区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用zookeeper管理远程MyCat配置文件、MyCat监控、MyCat数据迁移(扩容)JAVA连接SQLServer下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DataTable排序,检索,合并,筛选

http://apps.hi.baidu.com/share/detail/16252525 DataTable排序,检索,合并,筛选 DataTable排序,检索,合并详解 一、排序1 获取DataTable的默认视图2 对视图设置排序表达式3 用排序后的视图导出的新DataTable替换就DataTable(Asc升序可省略,多列排序用","隔...

RabbitMQ面试题

1、为什么要引入MQ系统,直接读写数据库不行吗?其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,如果不用 MQ 可能会很麻烦,但是你现在用了 MQ 之后带给了你很多的好处。 先说一下消息队列常见的使用场景...

TableView的使用

            项目现在基本出了一个版本,虽然做的是边缘工作,但是用到的东西还是整理一下吧,毕竟也算学了一点点东西。首先是TableView的使用。RWT是SWT的子集,因此,RWT中可能没有完全实现SWT的全部接口,也没有SWT那么完善。两者的架构不同,表现在显示形式,界面也不尽相同,但是基本的控件的时候还是相同的。这里首先通过SWT来学习一些常...

关于stm32 HardFault_Handler 异常的处理 死机

在系统开发的时候,出现了HardFault_Handler硬件异常,也就是死机,尤其是对于调用了os的一系统,程序量大,检测堆栈溢出,以及数组溢出等,找了半天发现什么都没有的情况下,估计想死的心都有了。如果有些程序开始的时候一切没有问题,但是运行几个小时候,会发现死机了,搞个几天下来估计蛋都碎了一地吧。。。一般来说运行操作系统  是以下几个问题 1.开始的...

Tableau 基础

1、Tableau产品介绍 tableau desktop:桌面端分析工具,分个人版和专业版,可连接几乎所有数据源,速度快tableau server:一款商业智能应用程序,用于发布和管理tableau desktop制作的仪表盘,同时也可以发布和管理数据源。基于浏览器的分析技术,即用户可以通过浏览器或平板电脑和同事进行协作,实现数据的交互tableau...

django 数据库迁移

一,简单的数据导出与导入(简单的迁移) 1. django 项目提供了一个导出的方法 python manage.py dumpdata, 不指定 appname 时默认为导出所有的app 1 python manage.py dumpdata [appname] > appname_data.json 比如我们有一个项目叫 mysite, 里...