GPU 不能完全取代 CPU 的最大原因是gpu计算能力为什么比cpu好?

回答问题前,知乎惯例:先问是不是。什么是“通用”计算能力?就是执行不特定代码的能力。完全不特定的代码,CPU能秒GPU十条街好吧?GPU强的是并行计算——这只是“不特定”里面的一些特例而已。仅仅某些特例的计算能力GPU强,就可以说“通用”计算能力GPU高于CPU么?正面回答问题:我们举一个例子,假设你很有钱,有一个很能干的私人管家(团队):某天早上你醒了 ,躺在床上刷知乎,突然看到这段视频:然后你很想让三上老师现场给你跳一遍,于是你马上找管家,让他搞定这件事。管家先在网上找到MUTEKI官网——日文的看不懂,于是他要先去找一个日语翻译;然后MUTEKI说可以,但要先给定金,而且他们只收JPY——于是管家要去把你的USD兑换成JPY转过去;为了让三上老师尽快过来,你打算用你的私人飞机去接三上老师——管家要联系好空管,申请航线;结果MUTEKI说三上老师休假了,去了北海道玩不在东京——管家要去更改航线;……反正就是你的管家很能干,一顿操作下来,当天下午三上老师就到了,和你愉快的共进晚餐,之后还给你表演了一段舞蹈。……于是你觉得SKE48成员跳舞就是好看,想和你的朋友分享,于是你搞了一个表演经纪公司,时不时组织SKE48和其它女团成员来表演一趟。管家花了大半天时间才找来一个人,经纪公司可以两三天就组织一批十多二十多个女团成员来表演一次,这么一个表演经纪公司只需要几个懂日语的文员沟通,日常开销比你的管家团队还低。是不是经纪就比管家团队的能力更强呢?是不是管家团队吃得多还干活不行呢?CPU就好比管家,需要处理各种突发请求,需要处理的事情层出不穷。也许你看着电影突然脑子一闪,就想翻出十几年前的照片看一眼——CPU本来在解码视频,然后就要去硬盘上找你的照片,运行看图软件的代码去把照片显示出来;可能你一边在刷知乎看到勃勃的哪篇想法就要敲一大段文字去和他对线——CPU本来在执行浏览器的代码(先不说还有各种网卡驱动、网络协议调用之类的事情),只要你在文本框点一下鼠标,就要马上调用输入法代码来处理你的输入,根据你敲击的字母和顺序展现不同的候选词……同时,CPU处理这些突发的请求,往往都是需要快速响应的——你不会接受因为自己原来在看视频,找张照片就要两三分钟,点击打开要几十秒才能打开来看;关掉照片继续看视频你不会希望停顿好几秒才能继续播放;更不会接受敲下一串字母后三五秒输入法才蹦出来候选词……此外,绝大部分情况,CPU处理的事情是前面的事情处理完了,才知道后面要做什么事情。例如上面的例子中,没联系上MUTEKI,就不知道要去换外汇,也不知道要改航线。而我们很常见的一个文件访问操作,CPU不解析完路径就不知道去哪个硬盘哪个分区找数据,不找到上一级目录的数据并且分析完毕就不知道下一级的子目录/文件真正存储的扇区位置。如果是执行一个程序的话,不先找到这个程序的文件位置并把数据载入内存,就完全不知道后面要运行什么代码,运行代码的时候不计算出判断条件的结果就不知道要跳转到哪一段程序去执行后面的过程……所以CPU耗费了大量晶体管和功耗,去实现种种可以缩短这些突发流程的处理时间的机制。例如高频率以及为了达到高频率把整个指令执行流程拆分成十多二十级流水;为了缩短代码跳转时间采用预测执行分支代码,在判断条件计算完成前就抓取某个分支代码并进行解码;对于没有结果依赖的代码采用乱序执行从而可以同时执行更多指令;缓存的目标是整个存储系统上的所有数据,需要更大容量的缓存……这些机制都耗费了大量的晶体管,而且这些晶体管在高频率下工作会消耗比低频工作高得多的功耗。为了降低功耗和进一步提升性能,需要一条指令可以做更多的事情,所以CPU有各种各样部分功能重合但又无法完全互相取代的组合指令,为了实现这些组合指令又消耗了更多的晶体管……GPU计算能力强则是只针对特定的,需要处理海量数据、超大量数据可以分组计算、计算顺序无关不需等待上一组算完就可以算下一组、往往是算上一组的时候后面就有好几组数据等待计算这样的应用。因此:GPU需要很多核心,数据可以分成更多组同时计算,每一组的计算时间更短从而缩短整个计算时间;在功耗限制下,每组核心能分配到的功耗很低,需要最大化能耗比,这意味着GPU的频率比CPU低得多;低频率不需要太深的流水线;计算顺序无关所以不需要乱序执行;大量数据等待计算,所以某一组数据计算过程中如果需要等待数据加载,可以先切换去计算后面几组数据,所以一方面必要用分支预测去先抓取后面的代码,另一方面缓存容量容纳下后续计算任务需要数据就足够;还有一点,就是在GPU进行这些计算过程中,相对少量的流程处理是CPU去处理了——什么情况运行哪段代码,CPU通过驱动程序控制;需要计算哪些数据,这些数据存储在什么地方,CPU去找了……虽然相对GPU的计算来说,这些操作的计算量很少,但完全由GPU自己处理的话,GPU还真处理不了,就算能处理的,整个计算过程的时间也会有相当大幅度的延迟。所以,GPU单个核心的结构比CPU简单的多,需要的缓存容量也小得多,自然可以节省下大量的晶体管,低频率又节省了大量的功耗,因此在一定芯片面积、功耗限制下,单个GPU可以容纳下比CPU多得多的计算核心。同样是台积电生产,5nm工艺生产的平头哥倚天710是128核心,每核心按照ARM X2公版计算为4个128位SVE单元;7nm工艺生产的NV GA100是108个SM单元,每个单元64×FP32+64×FP32/INT32+32×FP64;按照1×SVE=4×FP32=2×FP64算,倚天710和GA100的计算单元数量为2048:17280,接近1:8.5。
2017-04-19 11:27
来源:
嵌入式资讯精选
CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断,还会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂,而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。
这个视频,非常具象的表述了CPU和GPU在图像处理时的不同的原理和方法。看到GPU的模型喷射出的一瞬间,你就秒懂了。
根据上面视频中的比喻,你应该很清楚CPU和GPU就呈现出非常不同的架构:
绿色的是计算单元
橙红色的是存储单元
橙黄色的是控制单元
GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间,而且还有有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分。
GPU 如何加快软件应用程序的运行速度GPU 加速计算可以提供非凡的应用程序性能,能将应用程序计算密集部分的工作负载转移到 GPU,同时仍由 CPU 运行其余程序代码。从用户的角度来看,应用程序的运行速度明显加快。
GPU 与 CPU 性能比较理解 GPU 和 CPU 之间区别的一种简单方式是比较它们如何处理任务。CPU 由专为顺序串行处理而优化的几个核心组成,而 GPU 则拥有一个由数以千计的更小、更高效的核心(专为同时处理多重任务而设计)组成的大规模并行计算架构。
从上图可以看出:
Cache, local memory: CPU > GPU
Threads(线程数): GPU > CPU
Registers: GPU > CPU
SIMD Unit(单指令多数据流,以同步方式,在同一时间内执行同一条指令): GPU > CPU
CPU 基于低延时的设计
CPU有强大的ALU(算术运算单元),它可以在很少的时钟周期内完成算术计算。
当今的CPU可以达到64bit 双精度。执行双精度浮点源算的加法和乘法只需要1~3个时钟周期。
CPU的时钟周期的频率是非常高的,达到1.532~3gigahertz(千兆HZ, 10的9次方)。
大的缓存也可以降低延时。保存很多的数据放在缓存里面,当需要访问的这些数据,只要在之前访问过的,如今直接在缓存里面取即可。
复杂的逻辑控制单元。当程序含有多个分支的时候,它通过提供分支预测的能力来降低延时。
数据转发。 当一些指令依赖前面的指令结果时,数据转发的逻辑控制单元决定这些指令在pipeline中的位置并且尽可能快的转发一个指令的结果给后续的指令。这些动作需要很多的对比电路单元和转发电路单元。
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)架构, 他有成百上千个核,每一个核在同一时间最好能做同样的事情。
CPU会利用较高的主频、cache、分支预测等技术,使处理每条指令所需的时间尽可能少,从而减低具有复杂跳转分支程序执行所需的时间。GPU则通过数量丧心病狂的流处理器实现大量线程并行,使同时走一条指令的数据变多,从而提高数据的吞吐量。
举个GPU通用计算教材上比较常见的例子,一个向量相加的程序,你可以让CPU跑一个循环,每个循环对一个分量做加法,也可以让GPU同时开大量线程,每个并行的线程对应一个分量的相加。CPU跑循环的时候每条指令所需时间一般低于GPU,但GPU因为可以开大量的线程并行地跑,具有SIMD(准确地说是SIMT)的优势。
再以挖BIT币举例
比特币的挖矿和节点软件是基于P2P网络、数字签名、密码学证据来发起和验证交易的。节点向网络广播交易,这些广播出来的交易在经过矿工的验证后,矿工用自己的工作证明结果来表达确认,确认后的交易会被打包到数据块中,数据块会串起来形成连续的数据块链。
每一个比特币的节点都会收集所有尚未确认的交易,并将其归集到一个数据块中,这个数据块会和前面一个数据块集成在一起。矿工节点会附加一个随机调整数,并计算前一个数据块的SHA-256哈希运算值。挖矿节点不断重复进行尝试,直到它找到的随机调整数使得产生的哈希值低于某个特定的目标。
如果希望判定一个人提供的信息是本着正常使用,具备一定价值的。那么我们倾向认为提供这个信息的人,愿意为此付出一定工作量来证明他的诚实。假如有一种机制,能够容易的证明提供信息的人为此付出了一定工作量,那么此信息是可以接受,并被认为合理的。
比如,我收邮件的时候,做了一个规定:“把邮件内容数据,加入一个随机数,求一个sha256散列数值。这个散列值一共256bit 。前20bit 必须都为0”.
这样,要给我发信的人,就必须反复尝试一个随机数,以保证邮件内容数据加上这个随机数,能够产生sha256 的结果------前20bit 都是0。(这个计算过程本身毫无意义)。如何产生出指定要求的整数?完全靠运气和CPU 运算时间。这就是一个工作量。工作本身毫无意义。但是如果谁愿意付出这个工作量,就意味着他给我的邮件多半是有意义的。这就叫“工作量证明”。也就是意味着这个人很有可能是诚实的。这里把邮件换成Block也是等效的。这个机制被广泛用于防止垃圾邮件等。因为群发垃圾邮件的人,不可能有那么多时间去给每个人算一个毫无意义的数字,浪费时间,降低发垃圾邮件的效率。挖矿的目的是确认交易。寻找随机数的过程是为了保证每一个挖矿节点不会往外发送垃圾block。发送的BlockId是这个Block的Hash,它必然是首20bit为0的。
可以预见的是对于比特币的Hash计算而言,它几乎都是独立并发的整数计算,GPU简直就是为了这个而设计生产出来的。相比较CPU可怜的2-8线程和长度惊人的控制判断和调度分支,GPU可以轻易的进行数百个线程的整数计算并发(无需任何判断的无脑暴力破解乃是A卡的强项)。
OpenCL可以利用GPU在片的大量unified shader都可以用来作为整数计算的资源。而A卡的shader(流处理器)资源又是N的数倍(同等级别的卡)。
比特币早期通过CPU来获取,而随着GPU通用计算的优势不断显现以及GPU速度的不断发展,矿工们逐渐开始使用GPU取代CPU进行挖矿。前面我们已经介绍,比特币挖矿采用的是SHA-256哈希值运算,这种算法会进行大量的32位整数循环右移运算。有趣的是,这种算法操作在AMD GPU里可以通过单一硬件指令实现,而在NVIDIA GPU里则需要三次硬件指令来模拟,仅这一条就为AMD GPU带来额外的1.7倍的运算效率优势。凭借这种优势,AMD GPU因此深受广大矿工青睐。
现在你知道为什么AMD搞得跟蓝翔技校似得了吧?
1.
免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。返回搜狐,查看更多
责任编辑:
GPU就是图像处理芯片,外表与CPU有点相似。显卡的芯片,AMD的一个技术,相当于电脑的处理器CPU,只不过它是显卡的大脑或心脏。GPU是显卡的核心,显卡,则是由GPU、显存、电路板,还有BIOS固件组成的,所以GPU不等于显卡。GPU只是显卡上的一个核心处理芯片,是显卡的心脏,不能单独作为外接扩展卡使用,GPU因并行计算任务较重,所以功耗较大,只能焊接在显卡的电路板上使用。显卡上都有GPU,它是区分显性能的最主要元件,显卡也叫显示适配器,分为独立显卡和主板上集成显卡,独立显卡主要由GPU、显存和接口电路构成,集成显卡没有独立显存而是使用主板上的内存。如果是独立显卡,一般它就焊在显卡的电路板上,位置在显卡的风扇下面。如果是集成显卡,一般GPU就和CPU集成在一起了,这时候它和CPU共用一个风扇和缓存 。 因此GPU实际上就是显卡的核心部件,显卡主要就是靠它来工作的。比如把显卡的电路板看成主板,GPU就是显卡上的CPU,即显卡的中央处理器。现在的GPU开发厂家只有2个,一个是AMD(ATI),一个是N’VIDIA英伟达。GPU之于显卡,就相当于CPU之于电脑的关系。GPU运算时没有其他CPU那些指令集之类东西干扰,所以专一运算效率更高。GPU是图形处理器,一般GPU就是焊接在显卡上的,大部分情况下,我们所说GPU就等于指显卡,但是实际情况是GPU是显示卡的“心脏”,是显卡的一个核心零部件,核心组成部分。它们是“寄生与被寄生”关系。GPU本身并不能单独工作,只有配合上附属电路和接口,才能工作。这时候,它就变成了显卡。现在还没有出现GPU插在主板上的,因为GPU功耗很高,背面电流过大,还是焊接更为牢固。CPU和GPU大不相同,是由于其设计目标不同,它们分别针对了两种不同的应用场景。CPU主要是负责多任务管理、调度,它是领导者,负责指挥。计算能力方面没有GPU强。而GPU主要是用于大量的重复计算,它是计算专家,它的计算执行能力很强。但协议、管理不是它的专长,做不到指令流水化、多进程管理等,GPU没有多少自主处理指令的能力。GPU工作原理是CPU处理指令,遇到需要高度计算的地方,比如矩阵处理、图像渲染,CPU会交给GPU来加工,GPU行为基本上是CPU调动打,本身的指令不够强大。CPU对延迟更敏感,而GPU侧重于提高整体的数据吞吐量。线程、核、外部存储器、缓存上都存在差异,简言之,GPU打只要设计目标是以大量线程实现面向吞吐量打数据并行计算,适合于处理计算密度高、逻辑分支简单打大规模数据并行任务。而CPU则有复杂打控制逻辑和大容量打缓存减小延迟,能够适应各种不同的情况,尤其擅长负责逻辑运算。因此,GPU不可能取代CPU,只可能会融合在一起,CPU+GPU异构并行,互相配合。

我要回帖

更多关于 gpu运算速度是cpu的多少倍 的文章

 

随机推荐