LiteralliJeff 发表于 2022-1-18 08:31

CPU 和 GPU 的区别是什么?

本回答内容为转载。
原作者:Magnum Programm Life
原出处:博客园
原文链接: Magnum Programm Life
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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


  图片来自nVidia CUDA文档。其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。
GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间,而且还有有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分



  从上图可以看出:
Cache, local memory: CPU > GPU
Threads(线程数): GPU > CPU
Registers: GPU > CPU多寄存器可以支持非常多的Thread,thread需要用到register,thread数目大,register也必须得跟着很大才行。
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)架构, 他有成百上千个核,每一个核在同一时间最好能做同样的事情。

量子计算9 发表于 2022-1-18 08:37

本回答内容为转载。
原作者:Magnum Programm Life
原出处:博客园
原文链接: Magnum Programm Life
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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


  图片来自nVidia CUDA文档。其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。
GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间,而且还有有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分



  从上图可以看出:
Cache, local memory: CPU > GPU
Threads(线程数): GPU > CPU
Registers: GPU > CPU多寄存器可以支持非常多的Thread,thread需要用到register,thread数目大,register也必须得跟着很大才行。
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)架构, 他有成百上千个核,每一个核在同一时间最好能做同样的事情。

七彩极 发表于 2022-1-18 08:42

首先需要解释CPU和GPU这两个缩写分别代表什么。CPU即中央处理器,GPU即图形处理器。其次,要解释两者的区别,要先明白两者的相同之处:两者都有总线和外界联系,有自己的缓存体系,以及数字和逻辑运算单元。一句话,两者都为了完成计算任务而设计。
两者的区别在于存在于片内的缓存体系和数字逻辑运算单元的结构差异:CPU虽然有多核,但总数没有超过两位数,每个核都有足够大的缓存和足够多的数字和逻辑运算单元,并辅助有很多加速分支判断甚至更复杂的逻辑判断的硬件;GPU的核数远超CPU,被称为众核(NVIDIA Fermi有512个核)。每个核拥有的缓存大小相对小,数字逻辑运算单元也少而简单(GPU初始时在浮点计算上一直弱于CPU)。从结果上导致CPU擅长处理具有复杂计算步骤和复杂数据依赖的计算任务,如分布式计算,数据压缩,人工智能,物理模拟,以及其他很多很多计算任务等。GPU由于历史原因,是为了视频游戏而产生的(至今其主要驱动力还是不断增长的视频游戏市场),在三维游戏中常常出现的一类操作是对海量数据进行相同的操作,如:对每一个顶点进行同样的坐标变换,对每一个顶点按照同样的光照模型计算颜色值。GPU的众核架构非常适合把同样的指令流并行发送到众核上,采用不同的输入数据执行。在2003-2004年左右,图形学之外的领域专家开始注意到GPU与众不同的计算能力,开始尝试把GPU用于通用计算(即GPGPU)。之后NVIDIA发布了CUDA,AMD和Apple等公司也发布了OpenCL,GPU开始在通用计算领域得到广泛应用,包括:数值分析,海量数据处理(排序,Map-Reduce等),金融分析等等。
简而言之,当程序员为CPU编写程序时,他们倾向于利用复杂的逻辑结构优化算法从而减少计算任务的运行时间,即Latency。当程序员为GPU编写程序时,则利用其处理海量数据的优势,通过提高总的数据吞吐量(Throughput)来掩盖Lantency。目前,CPU和GPU的区别正在逐渐缩小,因为GPU也在处理不规则任务和线程间通信方面有了长足的进步。另外,功耗问题对于GPU比CPU更严重。
总的来讲,GPU和CPU的区别是个很大的话题,甚至可以花一个学期用32个学时十几次讲座来讲,所以如果提问者有更具体的问题,可以进一步提出。我会在我的知识范围内尝试回答。

IT圈老男孩1 发表于 2022-1-18 08:43

CPU    力气大啥P事都能干,还要协调。
GPU   上面那家伙的小弟,老大让他处理图形,这方面处理简单,但是量大,老大虽然能处理,可是老大只有那么几个兄弟,所以不如交给小弟处理了,小弟兄弟多,有数百至数千个,而且是专门只干这行和只能干这行。

jquave 发表于 2022-1-18 08:49

一个是通用计算,一个是专用计算。   
CPU主要负责操作系统和应用程序,GPU主要负责跟显示相关的数据处理,GPU的活CPU一般都可以干,但是效率低下,现在也有GPGPU,可以干点CPU的活。

七彩极 发表于 2022-1-18 08:53

当你操作电脑的时候,为了完成某项工作,需要电脑帮你工作,就像计算某个题目那样。
计算题目,理解题目并且整理出解题的步骤以及解法,那是CPU的事情。
但是解题的过程需要用到的众多计算,则需要一帮不需要很高逻辑理解力的计算者完成,他们只需要负责其中很简单但是数量又很大的简单运算就行了,最后他们把各自运算的结果交出来给CPU整理,那么这群计算者就是GPU。
这就是一个博士带着100个小学生的意思了

ainatipen 发表于 2022-1-18 08:53

引用自来自David Patterson 的书:《Computer Organization and Design: The Hardware/Software Interface, RISC-V Edition》(引用部分已经过个人翻译)
GPU和CPU的区别:

[*]GPU是一个加速器,是一个对CPU的补充,它的目的就是尽可能的加速图形处理速度。也就是说,对于GPU来说,可能处理某些任务的性能会非常差,甚至有些任务根本就没法在GPU上运行。但是这都不要紧,因为这些任务可以交给CPU做。
[*]对于GPU来说,计算问题的体量一般由几百MB到数GB之间,不需要考虑数TB的数据体量的问题。(书以2013年为例,这个论断在2019年已经不适用了)
[*]最大的不同是GPU并不依赖多级Cache来降低对内存访问的延迟。相反,GPU通过大量的多线程来规避了内存延迟对性能的影响。具体来说,在GPU等待内存数据到来的时候,GPU会运行几百到几千个与之前数据不相关的线程。
[*]与CPU内存系统相反,GPU的内存系统因此更加面向大的带宽而不是低延迟,而且GPU的内存大小通常要小于CPU。
[*]因为大量的并行线程带来了很好的处理带宽,GPU包含了数个平行处理核心并且每个处理核心都可以运行大量的平行线程。因此,GPU的并行运行能力比普通的CPU要大得多。

APSchmidt 发表于 2022-1-18 08:55

摘要: GPU在机器学习中至关重要,但很少有人能解释清楚,本文对此进行了一番研究。如果你从事机器学习,或者碰巧是NVidia的投资者,你一定听说过GPU对这个领域至关重要。但对我来说,GPU一直是个谜。我对“GPU=快速”有很好的理解,但仅此而已。
老实说,这能让你走得更远。我开始着手使用Keras进行ML工作,Keras是谷歌的TensorFlow库之上的API。Keras是一个设计精美的API,它做出了一个非常实际的决定:大多数事情应该是简单的,困难的事情应该是可能的。
正因为如此,我真的不需要学习任何关于GPU的知识。我只是运行了一些神奇的操作系统命令和一些神奇的代码行-嘣!-大规模模型训练加速。我对这种情况非常满意。
然而,在feedly最新的项目中,我们决定试用PyTorch,因为它越来越流行。但也有一些有利的数据。新的(强烈推荐的)fast.ai课程顺序从Keras切换到PyTorch。 PyTorch模型也赢得了很多最近的Kaggle比赛。
所以我们深入研究并发现PyTorch通过清晰一致的API使所有事情成为可能。它比Keras更灵活,所以权衡的是简单的事情变得更难,但困难的事情变得更容易。如果你正在尝试新的或不寻常的模型(或者你碰巧是一个控制狂),PyTorch绝对是一个更好的选择。
当GPU加速我的PyTorch模型的时候,我谷歌了一下神奇的“GPU -> on”代码行,我发现它不存在!一如既往,Pytorch使这比Keras更难实现,但是提供了一些关于如何着手做事的API。所有这一切的结果是,我不得不咬紧牙关,建立了一个关于GPU如何被用来加速模型训练的心智模型。
为什么GPU很快

模型通常具有许多很多参数。例如,流行的VGG图像分类模型有大约1.4亿个参数,分为16层!在运行推理(预测)时,你需要将输入数据(图像)传递到每个图层,通常将该数据乘以图层参数。在训练期间,你还必须稍微调整每个参数以更好地拟合数据。那是很大的计算量!
CPU很擅长快速完成一些事情。 这通常很好,有足够的分支(如果用户这样做,那样做),以及大规模并行性实际上不可能的其他顺序约束。GPU很好,可以做很多“慢”的事情。由于它们最初用于执行图形要求,因此它们希望一次性完成大量工作(考虑将图像的所有像素转换为灰度)。所以这里有一个权衡,对于ML来说GPU由于可以并行完成这些巨大的算术运算而赢得大量时间。
具体来说,我的macbook有一个运行速度为3.1Ghz且有4个内核的CPU。NVidia K80 GPU拥有近5000个内核,尽管运行速度要慢得多——562Mhz。虽然这样做并不公平,但你可以看到K80的时钟速度大约慢了6倍,但是并行速度提高了1250倍。
如何考虑GPU

PyTorch不是代码行“GPU -> on”,而是“CUDA”张量。CUDA是一个用于在GPU上执行操作的库。基本上,PyTorch要求你声明要在GPU上放置的内容,然后你可以像往常一样执行操作。所以我想,让我们试着在GPU上添加一个图层:




我运行代码,立即得到了一个错误在隐藏层计算中:




为什么?我立即知道它与我添加的.cuda()代码有关,但我不知道为什么。在思考了GPU应该如何加速之后,我意识到,“当然它不工作,一个张量在GPU上,另一个仍然在主内存中!”一切都搞定了。Pytorch允许在GPU内存中分配张量,然后使用GPU对这些张量进行操作。但是这些操作的结果会怎样呢?让我们试试另一个例子:




这是GPU内存中的另一个张量!经过更多的反复试验,我发现我不得不改变自己的思维方式。原来我以为内存、CPU和GPU都混在一起了:




我意识到我需要这样想:




从本质上说,CPU/主内存和GPU/GPU内存都位于各自的小宇宙中。来自软件工程背景的我开始将GPU操作看作是一个REST API。当你使用REST API时,真正的成本是来回发送数据。在本地执行任务的速度与在远程服务器上执行任务的速度一样快。但是你要避免的是大量的数据来回传输,因为这是纯粹的开销。
把这个类比往前推,我们可以看到,当然,PyTorch matmul结果是一个GPU张量是有道理的。这样就很容易在GPU上进行进一步的操作,而不需要将数据传送到主内存,然后再返回到GPU。所以如果我们想要使用GPU,我们真的想要GPU上的所有参数,因为这些参数将会被反复使用在前向传递中产生预测然后在后向传递中更新。每一批特性都必须被传送到GPU内存中。但是中间的和最终的结果(比如隐藏层的输出)只能存在于GPU内存中。我们需要做的就是不断向GPU发送命令,告诉它如何操作参数和权重。
因此,在API类比中,我们只做两个“重”请求(在上图中加星标的),一个用于初始化权重,另一个用于在训练后获得最终权重。但我们可能会在这两个请求之间发出数百万个轻量级请求来训练模型。
GPU性能的提高是真实的,而且是惊人的

那么什么样的加速是可能的呢?PyTorch有一个不错的MNIST小例子我们可以使用。使用CPU运行10个epoch需要153秒,使用GPU需要83秒。我们可以从理论上说,更大的模型可以获得更大的收益。 不错,真不错。
一些实验

这一切都很棒。经过一番思考和一些糟糕的绘图之后,我对GPU的了解要好得多,并且所需的额外编码也不错。但我的想法是否正确?回答这个问题的最好方法是建立一个实验。我想向自己证明运输数据是工作流程的“缓慢部分”。所以我尝试了以下三件事:
1.做一个200x200矩阵乘以numpy,一个高度优化的CPU线性代数库。
2.使用PyTorch cuda张量在GPU上进行200x200矩阵乘法运算。
3.使用PyTorch cuda张量在GPU上进行200x200矩阵乘法运算,每次都来回复制数据。

正如预期的那样,GPU只运行得更快,这一次大约是6倍。有趣的是,1和3几乎花费了相同的时间。GPU操作的效率几乎完全被数据传输的低效所平衡!



以上为译文。由阿里云云栖社区组织翻译。
译文链接
文章原标题《Demystifying the GPU》
作者:kireet,译者:Viola,审校:。
文章为简译,更为详细的内容,请查看原文。
更多技术干货敬请关注云栖社区知乎机构号:阿里云云栖社区 - 知乎
本文为云栖社区原创内容,未经允许不得转载。

ChuanXin 发表于 2022-1-18 08:58

端午回来,发的第一篇文章,还在谋划其他事情,大家共勉。

现在电脑这么普及,应该每个人都知道 CPU ,即使不懂电脑的人都能憋出大招告诉你电脑里面有一个 CPU,CPU 是中央处理器,是很多很多年积累下来的,因特尔公司发财的亲儿子啊。




有一些比较专业的人会蹦出 GPU,GPU 是干嘛用的?为什么有了 CPU 又出来一个 GPU?特别前几年挖矿很流行,一些码农就衍生出电脑 GPU 来挖矿,这些年人工智能,神经网络算法流行也是离不开 GPU 的功劳。

CPU 设计的时候是为了满足很强的通用性处理各种不同的数据类型,特别典型的就是浮点运算,这个需要消耗比较多的时钟周期,不仅仅是数据运算,还有逻辑运算,基于这样的需求,CPU 设计的内部结构非常复杂,这可以类比一个国家的皇帝,需要处理大臣们的奏折,也需要处理很多后宫的事情,计算机普及到后来,大家对于图形显示的要求越来越高,特别是 3D 建模这种事情,CPU 不能丢下自己的工作去干这种负荷高的工作,所以英伟达觉得可以有机可乘,就出现了 GPU。

GPU 设计出来的目的就比较单纯,就好像我需要把一块砖头搬到 10 楼,不管你用一个皇帝来搬砖,还是很多小孩子当苦力还搬砖,都是需要从 1 楼走到 10 楼,CPU 不需要跟太多其他人交涉,他需要干的事情比较纯粹,单一繁重。

GPU 和 CPU的对比图




观察颜色,绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。

网上有一个比喻用来比较 GPU 和 CPU ,我觉得非常贴切,100 个小学生和一个大学教授组成两队进行数学比赛,第一回合是两队分别完成 100 道四则运算题,比赛开始,第一回合教授还在写的时候,小学生们已经完成了答题,然后进行了第二回合,第二回合是两队分别完成 1 道高等数学题目,教授已经完成了答题,100 个小学生们还在苦苦冥想。
上面只能当成一个笑话来看,GPU 和 CPU 负责不同的事情

GPU处理视觉元素:





例如着色器,效果,阴影,光线,纹理等、图形卡确定一次可以显示多少个多边形、它还会显着影响任何给定对象的分辨率有多高、GPU是游戏的过滤器、它处理发光效果,能力效果,光源等。

GPU 真实的意义在于有一天有一个电脑游戏狂热粉觉得自己的界面显示太丑了,没有各种酷毙的感觉,然后 GPU 就出现了,专门用来出来这种吃力不讨好的事情,你想要 3D,那我就给你 3D ,你想要挖矿,我就给你挖矿,等等。

CPU处理物理和逻辑元素:





CPU 是干嘛的?
我觉得可以说 CPU 是电脑的核心,没有 CPU 就没有计算机,就没有操作系统,就没有你天天看着电脑玩游戏这回事,GPU 是辅助这个世界变得更好,没有 CPU 就没有电脑世界。

你可以说CPU是大脑,GPU是眼睛。你的大脑了解世界,它是如何运作的,物理学等等、当你的眼睛在创造图像时,你会看到世界。

有一个老外,做了一个非常有意思的实验来对比 GPU 和 CPU,我觉得非常有意思



神经网络





神经网络有一个学习的过程,我之前做 AI 音响的时候,有拿网上的一个算法库来学习,使用的是公司的服务器,学习过程也需要 2 天,GPU 有一个特点是核比较多,可以用几千个核来执行上面的几百条运算,速度肯定就快了,这也是 GPU 存在的最大意义了。



<hr/>

kirin77 发表于 2022-1-18 09:07

我想补充一个从编程角度看CPU和GPU不同的回答。
很多人把GPU的核心(比如NVDIA显卡的CUDA单元)和CPU的核心放在一起,然而它们是有区别的。我正在学CUDA编程,所以我想简单概括下我的理解。
CPU的多核心,是把一个CPU复制了多份,构成了多处理器系统,操作系统负责将多个线程调度在多个核心上同时执行。操作系统管理的线程数量比CPU的核心多很多,所以多个线程轮流占用CPU时间,线程切换开销很大。但是就每个线程而言,它都是完全独立的,它顺序执行一系列的指令,有自己的上下文(通常是寄存器和堆栈)。每个核心同时可以运行不同的线程,甚至它们属于不同的进程。CPU的延迟很低,无论是四则运算还是存取数据。尽管这样,现代的CPU还使用SMT(超线程)来隐藏延迟,对编程者来说,它们看到了更多的逻辑处理器在并行。
GPU的多个管线(pipeline)或者CUDA单元(unit),构成了单指令多数据(simd)并行,如果一块GPU有384个CUDA单元,是不是有384核心呢?不是。如果和CPU类比,它相当于一个有192条管线的双核CPU(这里是打比方,在另外一些GPU上,也可能是32x12等等),而不是384块CPU。作为对比,在超标量的处理器上,CPU有几条管线。可以在指令层面并行。但是因为CPU执行的是数据存在上下文高度关联的串行(标量)运算,所以CPU增加大量的管线并不能加速串行运算。但是GPU上可以。那么这样一块显卡,是相当于双核心的CPU了?也不是。还是拿CPU类比,CPU为了延迟的隐藏,使用了超线程,将一个物理CPU逻辑上虚拟成2个。而GPU则是让一批的“线程”(注意这个线程不同于CPU上,操做系统管理的线程)去填充管线。比如说你的GPU只有384个CUDA单元,但是同时并发的线程可以有上万个。GPU的计算延迟非常高。打个比方,有32个时钟(实际上可能不是32,而是别的数字)。那么执行一条加法,就需要32个时钟才能完成。然而执行2条加法并不需要64个时钟,而是33个时钟。这是因为第一条加法送入GPU后,过了一个stage,就可以执行下一个线程的另一条加法了。理想情况下,一个拥有每条线程需要32个时钟才能执行一条指令的管线的CUDA处理单元,它就可以并发32条线程。再乘以384,因此不是说384个单元并发384条线程,而是12288条,想想恐怖吧。(上面说的GPU有384个CUDA单元,划分成2个“核”,每单元32个stages,在CUDA的术语中,2个“核”叫做2SM,384单元叫做384SP,32stages叫做block=32。)
然而上面说的只是理想情况。实际情况是,一个拥有2560个CUDA单元的GPU,可以并发十万线程,只比一块8核心16线程的CPU快了十几倍,而不是上万倍。我想这有几个原因,一个是没有那么多操作可以高度并行化,GPU在做通用运算的时候效率比理论值低很多很多。另一个就是GPU本身很渣。NV曾经想做x86 CPU的,但是没有做成,如果用他们做GPU的效率水平做CPU,可能同频率能做到Intel的1/5或者1/10就不错了。台湾的威盛曾经做了一块VIA C3处理器,浮点运算效率只有同时代同频率的Pentium III的1/8,而VIA还算是除了Intel/AMD的行业第三。
GPU的性能还被人为限制了。如果一块几千块钱的显卡的性能(而且刨掉显卡本身的成本,显存,只算GPU本身,就更低了),比几千块钱的CPU的运算能力大了几百倍几千倍,那GPU卖的太便宜了不是么?不只是我这么想,NVIDIA也这么想。他们采取的办法是,人为限制显卡的双精度浮点运算能力。因为在大型游戏中,单精度浮点就足够了,没有必要考虑双精度的效率。而在3d渲染、科学计算中,就需要双精度运算。注意是限制,而不是完全屏蔽。游戏显卡也可以以比同时代CPU略微高一些的性能处理双精度浮点,这是为了方便学习、开发、测试用途地将GPU当作运算卡用。所以NV找到了一个切分不同市场的点——你买显卡去玩游戏,或者你是一个学生或者开发者,在开发测试环境里计算,我几千块钱卖给你。如果你买同样的显卡做科学分析、3d渲染,那么我就把同样的东西加价几倍甚至更多卖给你(这就是专业卡、计算卡),你赚得多,我从你那里赚得也多。
其实Intel也想这么做——把便宜的CPU卖给个人和家庭,把昂贵的CPU卖给企业。然而很不幸,在CPU上找不到这么个点。当然,Intel也用品牌洗脑、允许服务器CPU做多SMP,而限制家用CPU的多处理器能力等方式来划分市场。但是相比较而言,NV心更黑一些。
页: [1] 2
查看完整版本: CPU 和 GPU 的区别是什么?