迅维网

查看: 1989|回复: 20
打印 上一主题 下一主题

为什么现在更多需要用的是 GPU 而不是 CPU,比如挖矿甚至破解密码?

[复制链接]
跳转到指定楼层
1#
发表于 2018-1-31 10:49:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: LAN 来自 LAN

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x
从煎蛋一篇文章iOS热点密码不随机,破解仅需一分钟看到提到: 不过,他们成功的原因在一定程度上也要归功于破解硬件的发展:4张AMD Radeon 7970显卡的GPU一同工作可在50秒内完成破解。 又产生了前段时间对挖矿(bitcoin)的疑问,网上查到资料挖矿的速度无不在于GPU给不给力。 我的一贯认识中cpu才是运算速度的核心啊,为什么现在GPU的运算越来越流行

2#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
谨以此文纪念我的第一块显卡,nVidia Riva TNT2。

很久以前,大概2000年那时候,显卡还被叫做图形加速卡。一般叫做加速卡的都不是什么核心组件,和现在苹果使用的M7协处理器地位差不多。这种东西就是有了更好,没有也不是不行,只要有个基本的图形输出就可以接显示器了。在那之前,只有一些高端工作站和家用游戏机上才能见到这种单独的图形处理器。后来随着PC的普及,游戏的发展和Windows这样的市场霸主出现,简化了图形硬件厂商的工作量,图形处理器,或者说显卡才逐渐普及起来。

想要理解GPU与CPU的区别,需要先明白GPU被设计用来做什么。现代的GPU功能涵盖了图形显示的方方面面,我们只取一个最简单的方向作为例子。

大家可能都见过上面这张图,这是老版本Direct X带的一项测试,就是一个旋转的立方体。显示出一个这样的立方体要经过好多步骤,我们先考虑简单的,想象一下他是个线框,没有侧面的“X”图像。再简化一点,连线都没有,就是八个点(立方体有八个顶点的)。那么问题就简化成如何让这八个点转起来。首先,你在创造这个立方体的时候,肯定有八个顶点的坐标,坐标都是用向量表示的,因而至少也是个三维向量。然后“旋转”这个变换,在线性代数里面是用一个矩阵来表示的。向量旋转,是用向量乘以这个矩阵。把这八个点转一下,就是进行八次向量与矩阵的乘法而已。这种计算并不复杂,拆开来看无非就是几次乘积加一起,就是计算量比较大。八个点就要算八次,2000个点就要算2000次。这就是GPU工作的一部分,顶点变换,这也是最简单的一部分。剩下还有一大堆比这更麻烦的就不说了。

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

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

至于如何将挖矿和破解密码这种事情分成小学生都能做的简单任务,就是程序员的工作了。所以以后谁再跟你说程序员的工作就是体力活,你可以直接抽他。

谢邀

回复 支持 反对

使用道具 举报

3#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
现在更多被需要的依然是CPU,只是GPU在大规模并发计算中体现出其一技之长所以应用范围逐渐变得广泛,并成为近些年的热点话题之一。

为什么二者会有如此的不同呢?首先要从CPU和GPU的区别说起。

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

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

图片来自nVidia CUDA文档。其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。

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

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

回复 支持 反对

使用道具 举报

4#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
作为一个写了两年CUDA,发了若干GPGPU水文的学渣, 我只想说就目前的计算机架构,GPU只能称作是小众。GPU作为后来者,出现的太晚了,计算机架构已经定型,不太可能撼动 Intel 的霸主地位,而且Intel 一定会借着先天优势打压其他竞争对手。 最近bitcoin被媒体炒作的太过了,出现在了公众的视野中。媒体写新闻的那群人只要是写点和技术沾边的文章,就能暴露他们的无知,倒霉的还是无辜的群众。

我简单提一下为什么GPU只能算作是小众。在计算机上运行的程序从性能的角度来说大致可分为三类:(1) I/O intensive; (2) Memory intensive 以及 (3) Compute-intensive

(1)I/O intensive的程序其性能瓶颈是I/O,也就是说程序运行的大部分时间花在了硬盘读写/网络通信上,而I/O处在计算机体系结构金字塔的最底层,速度非常慢。最近炒的很火的big data 讨论的就是这一类应用程序。几百TB 甚至到PB级别的数据往哪搁,只能放在硬盘上。一台机器容量太小CPU太少怎么办,搞几百台甚至上千台机器用网线连起来分布处理。所以这块全是I/O, 现在大的互联网公司不多搞几个上千节点的集群肯定撑不住。

(2)Memory intensive的程序其性能瓶颈在内存访问,程序中有大量的随机访问内存的操作,但是基本没有I/O,  这类程序已经比第一类程序快一个数量级了,但是和寄存器的速度还是没法比。目前大部分应用程序都属于这类。个人电脑里装的的各种软件基本就是这类,如果有点I/O,  立刻就会非常得卡。

以上提到的这两类程序的应用最广泛,涵盖了大部分有用的计算机软件,但遗憾的是GPU在这两块毫无用处, GPU只有在计算密集型的程序有些作用。I/O是瓶颈的程序,花在计算的时间可以忽略不计,再怎么用GPU加速也没用。 含有大量内存随机访问的程序也不适合在GPU上执行,大量的随机访问甚至可以使GPU的行为由并行变为串行。

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

(1)计算密集型的程序。所谓计算密集型(Compute-intensive)的程序,就是其大部分运行时间花在了寄存器运算上,寄存器的速度和处理器的速度相当,从寄存器读写数据几乎没有延时。可以做一下对比,读内存的延迟大概是几百个时钟周期;读硬盘的速度就不说了,即便是SSD, 也实在是太慢了。
(2)易于并行的程序。GPU其实是一种SIMD(Single Instruction Multiple Data)架构, 他有成百上千个核,每一个核在同一时间最好能做同样的事情。
满足以上两点,就可以用GPU做运算了。 不过你还得先用CUDA或者Open CL 把能在GPU上运行的程序写出来, 这也是很麻烦的,写一下就知道了。 而且GPU的架构比较特殊,要想写出高效率的程序,要花很多很多时间。我想说写GPU程序是一件很蛋疼的事情。

GPU在某些地方很有用,但应用面比较窄,远远没有某公司声称的那么有用。当今还是Intel的天下, 现在计算机的速度已经很快了,计算其实已经不是什么大问题。I/O才是最需要解决的问题。 记得曾经看过N家的GTC峰会,黄某人吹得神乎其神,连我都被感动了,多少多少T FLOPS的计算速度。 程序运行时间从100 秒 变成 1秒 其实没多重要,你倒杯水的功夫就100秒了。运行时间从100天缩短到1天才是大贡献。 前者就是GPU做的事情,后者才是我们真正需要的。

p.s. 在公司的hadoop上跑任务慢得跟狗一样,每次遇到这种情况我就想说你们这些在top conference 灌GPU paper的来用GPU加速一下?  呵呵

回复 支持 反对

使用道具 举报

5#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
谢邀。我觉得劉帥已经写的非常棒了,我能做的无非是重复他说的,另外就是根据他说的延伸一下。
现在的GPU的特色就是超长流水线、大规模并行。也就是说它擅长的只是一些特殊的计算任务,在这些它所擅长的任务中,它的性能表现就比CPU强很多,这也就是为什么发生了问题里提到的运用GPU算力的程序比常规的计算机程序性能强大很多的现象。
然后就是GPU计算的弱点。劉帥提到,GPU只有简单的控制逻辑并省掉了缓存。这导致了GPU程序在遇到存在大量分支(通俗点说就是条件判断)的时候计算性能暴跌。
你可以把GPU想象成类似量子计算机,适合特定的运算,但对常见的运算任务表现就不突出或者很糟糕了。

另外关于GPU适合算比特币,这有可能是有意这样设计的。中本聪的一些电子邮件通信表明他希望挖矿的这些编码计算是很多互相独立的快速计算的积累,这样可以保证不同的挖矿者挖到的量按算力平摊,而不是让算力最强的那些人挖走全部的矿。而这种类型的计算通常很适合用GPU这种大规模并行的处理器处理。

回复 支持 反对

使用道具 举报

6#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
算法可预测性高,控制回路少,重复性高,则可用gpu大量多核提速

回复 支持 反对

使用道具 举报

7#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
挖个坟


@Cascade 的回答很好的说明了CPU和GPU计算能力的差异了。我来说一下为什么GPU计算越来越流行。


一句话结论:数据越来越多了。


IT界发展到今天,我们有大量的数据需要处理。我还记得90年代初学电脑的时候,代码都是自己手敲进去的,屏幕上显示的图形都是自己一个个坐标描点出来的。就国内来说,这个时候,电脑用户基本就是科研的哪一个圈子。


然后随着电脑的普及,最早应该是办公电子化,用电脑编写各种公文表格,一篇论文、文档,每个字,每个单词,每个数据都是手敲进去的,所以那时候输入速度快的五笔很重要,也催生了打字员这个岗位。很多单位都有电脑了,但Word/Excel/WPS这类文件也没多大。


再然后进入多媒体时代,早期的音乐只有MIDI,体积也很小,图形方面么,开始有画板之类的软件可以用电脑作画,那也是个苦逼活。不过多媒体时代的发展还是很迅速的,很快就逐步发展出声音录制成wav、照片扫描这类技术,这个时候的多媒体文件,已经变得不小了。再之后的视频采集,更是存储杀手。不过呢,哪个时候的多媒体文件数量还是有限的,一般人也没有这类采集设备,当时比较流行的数据传递方式是光盘拷贝。


然后就是互联网的开始流行,随着网络带宽的提高,数据的分发复制变得容易。这个时候数码相机、数码摄像机也开始流行起来了,所以整个业界的数据容量迅速发展。此外,互联网导致的电脑普及,几乎家家户户都有一台电脑,也使得创造数据的人变得越来越多。例如网上的博客、论坛,有无数的文章。


到了移动互联网时代,人手一台手机,随时录音拍照摄像定位,都会产生大量的数据。这些数据又都可以通过互联网汇聚到不同的组织手上,例如政府部门、互联网公司、金融机构、其它传统业务的公司/组织等等。一家公司从创建到积累到上TB甚至PB级别的数据会非常迅速,然而这些数据单单收集回来用处并不大,从这些大量的数据里面进行转换、分析、提取出有价值的信息就不可避免了。而且这些数据中,简单有效的信息数据虽然多,但是整体数据量其实不大,更大量的是各种多媒体数据。而多媒体数据的一大特征就是海量的向量数据组合构成有效信息——这正是GPU运算的优势项目。


所以,越来越多的多媒体数据,导致的结果就是GPU运算的越来越流行。

回复 支持 反对

使用道具 举报

8#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
硬件加速不完全是并行计算的问题,总体来说GPU背后的理性是投入硬件资源获得性能优势。
你把图形有关的运算分离出来,设计专门的硬件来处理,从而获得性能的最优化,这是GPU可以长盛不衰的根本原因。但是因为图形处理的特性,也就是并发和大数据,GPU也可以胜任类似的工作。但是在并行能力不好的程序,以及其他很多多种多样的操作,它都无能为力。反过来说,无论你的程序并行能力如何,我们都可以做成独立的硬件,而这样往往都可以获得更好的性能。

并行不能解决所有问题的理论依据或者说限制很多,根本上的论断是Amdahl's Law,即你通过并行加速的极限取决于程序中并行的成分。还有很多相关的因素,诸如Limits of Instruction Level Parallelism, Memory Wall, Execution Phases 等等。解决方案也是众说纷纭,如果说有个和GPU长得比较像的方案就是你搞一个可编程器件的加速器,根据你执行的程序的历史,自发的把自己做成相应的加速器。这样你执行最多的片段就会获得很大的优化,那么你的电脑就会“越用越快”。

很久不看文章了,所以以上言论,概不负责。

回复 支持 反对

使用道具 举报

9#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
谢邀~

问题说“为什么现在更多需要用的是GPU而不是CPU,比如挖矿甚至破解密码?”。应该说,这个问题本身就是不合理的,因为目前大部分场景中更多需要的仍然是CPU,只有很少的计算应用中需要使用GPU加速。

那么,我们来讨论一下GPU有怎样的特点,以及在这些特点之下产生的适用场景和优势。

先说明一下,一般来说同一时刻一个CPU或GPU计算核心上(就是我们通常所说的“核”)只能够进行一个运算,在超线程技术中,一个计算核心在同一时刻可能进行多个计算(比如对于双核四线程的CPU,在不发生资源冲突的情况下,每个计算核心可能同时进行两个计算),但超线程通常只是使逻辑计算核心翻倍。我们平时看到自己使用的CPU可以同时运行几十个程序,实际上,从微观角度来说, 这几十个程序在一定程度上仍然是串行的,比如在四核四线程CPU上,同一时刻只能够进行4个运算,这几十个程序便只能在四个计算核心上轮换执行,只是由于切换速度很快,在宏观上表现出的就是这些程序在“同时”运行。

GPU最突出的特点就是:计算核心多。CPU的计算核心一般只有四个、八个,一般不超过两位数,而用于科学计算的GPU的计算核心可能上千个。正由于计算核心数量的巨大优势,GPU在同一时刻能够进行的计算的数量远远地把CPU比了下去。这时候,对于那些可以并行进行的计算,利用GPU的优势就能够极大地提高效率。这里解释一下任务的串行计算和并行计算。串行计算通俗来说就是先计算完一个之后再计算下一个,并行计算则是同时并行的计算若干个。比如计算实数a与向量B=[1 2 3 4]的乘积,串行计算就是先计算a*B[1],再计算a*B[2],然后计算a*B[3],最后计算a*B[4],从而得到a*B的结果,并行计算就是同时计算a*B[1]、a*B[2]、a*B[3]和a*B[4],得到a*B的结果。如果只有一个计算核心,四个计算任务是不可能并行执行的,只能够一个一个地串行计算,但如果有四个计算核心,则可以把四个独立的计算任务分到四个核上并行执行,这便是并行计算的优势所在。正因如此,GPU的计算核心多,能够进行并行计算的规模便非常大,对于一些能够通过并行计算解决的计算问题便表现出了优于CPU的性能。比如破译密码,将任务分解成可以独立执行的若干份,每一份分配在一个GPU核心上,便可以同时执行多份破译任务,从而加快破译速度。

但并行计算不是万能的,它需要一个前提:问题可以分解为能够并行执行的若干个部分。很多问题不满足这个条件,比如一个问题有两步,而第二步的计算依赖于第一步的结果,此时,这两部分便不能并行的执行,只能够串行地依次执行。实际上,我们平时的计算任务常常有复杂的依赖关系,很多重要的计算任务并不能够并行化。这是GPU的一个劣势。

另外,GPU只是浮点运算能力比较强,其整数运算和逻辑运算较弱,控制运算的能力尤其若。现实场景中,控制运算是计算机使用过程中很重要的部分,GPU相对CPU而言,在这一方面无能为力。GPU只是在某些方面辅助计算机进行计算的一个设备,而各种设备(比如键盘、打印机等)的连接与控制仍然由CPU完成。从这一点来说,GPU只是CPU手中的一个计算器,对于某些计算任务,CPU会控制GPU来进行计算。

总体来说,GPU擅长的是且仅是成规模的并行计算,而不能并行执行的任务或者与控制相关的任务都与GPU离得很远。GPU只是个计算器,计算密集型的并行计算任务可以分配给它,但CPU是整个计算机进行计算与控制的核心,手握计算机的控制大权,这是GPU无法代替的。

回复 支持 反对

使用道具 举报

10#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
07年知道CUDA,09年开始用CUDA写paper,从CUDA1.0到现在的5.0。
简单地说,CPU设计用来做逻辑调转多的运算,GPU就是设计用来做大量的数值计算的。
做个形象的比喻,一辆跑车和一辆卡车会有一样的马力,但是跑车可以在山路多弯的地方跑得很快,而卡车可以同时一次运送几百倍于跑车的货物。
而破译密码就是一个体力活,把那么多排列组合算完了就能破解,所以需要大量的计算,所以GPU更好

回复 支持 反对

使用道具 举报

11#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
因为GPU比CPU快
因为GUP瞎快,只会计算
因为CPU是用来做逻辑运算的
因为楼主说的这些场景只需要瞎计算

回复 支持 反对

使用道具 举报

12#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
即使是在高性能计算的情况下也不能简单的认为GPU已经取代了CPU。因为GPU现在的显存还是太少了,一个普通的N卡只有2-3G显存,像titan也只有6G,还不能满足计算要求。

GPU适合轻量级线程的计算任务,也就是每个线程使用很少的内存。比如如果同时开1000核,每个核使用10M内存,那么1000核就需要接近10G的内存。现阶段的显卡还没有办法满足这样的要求。如果你再配一个显卡,那就成了同时开2000核,内存的需求还是不能满足。如果你只是把它当做显存使用,那么计算能力就闲置了。

多核CPU如果构成集群,计算能力也是非常强大的,而且CPU计算的好处在于内存的可扩展性好。所以适合重量级线程的计算任务。一个100核的CPU集群,每个核用100M内存,也才10G。现在家用高配的台机都不止这个内存大小了。

对于条件分支的问题,无论是GPU还是CPU集群都会涉及如何处理“同步”或者“异步”,并不是区别两者最大的地方。因为GPU应该和CPU集群比较,而不是单核CPU。

并行的程序编写思路类似,因为习惯了顺序式的编程,写起来都有些困难,同时调试起来也很困难,他们都可以针对缓存作很多优化,所以也不是最大的差异。

回复 支持 反对

使用道具 举报

13#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
计算四则运算用一大群小学生就足够了,不需要四个博士

回复 支持 反对

使用道具 举报

14#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
我想说,如果一个不错的cpu,上面只跑你的程序,不跑操作系统,那速度也是相当的快的。

回复 支持 反对

使用道具 举报

15#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
就好比搬砖。1万块砖头。一个工程师要搬1万次。1万个农民工兄弟一起搬1万次。但是农民工兄弟画不了图啊啥的。

回复 支持 反对

使用道具 举报

16#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
最近正好在学cuda,课上老师讲了一个比喻很形象,CPU就好像是几头牛,而gpu就是一群鸡。

回复 支持 反对

使用道具 举报

17#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
如果没记错的话,GPU的运算器占的比例比如大,而CPU还有控制器等其它控制单元占比较大.拿挖矿来说GPU更多的是充当"矿工"的角色,它只需要想着挖矿就行.而CPU除了挖矿,还有"技术人员"这个角色.得想着怎么挖,怎么指挥多个矿工挖.

回复 支持 反对

使用道具 举报

18#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
如果当成比赛,GPU是一群小学生,算算1+1这样的,算对了就得分,而对手cpu是个教授,题目是1+2+。。。100,或者1/2+1/3。。。1/100,这样的,算对了才得分,很显然,小学生干不了教授的活。。。

回复 支持 反对

使用道具 举报

19#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
国内现在GPU用的还是少,主要在几个科研机构里。前段时间去了物理所,倒是部署了一堆G卡

回复 支持 反对

使用道具 举报

20#
发表于 2018-1-31 10:49:19 | 只看该作者 来自: LAN 来自 LAN
https://www.youtube.com/watch?v=-P28LKWTzrI#action=share 这个视频很形象地解释了 GPU/CPU 的差异。结合其他答主和这个视频应该可以对两者的差异有较好的理解。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复