常常提及 CPU 和 GPU 但是大部分时候只是知道名词具体指向什么东西,但是对其中的概念和区别不是很了解,借着梳理渲染知识的机会重新整理整理学习。

区别

  1. 用途上的区别:CPU 被设计出来处理通用计算的核心部件,能处理很多复杂的任务和不同的数据结构;GPU 是专门针对制定类型的图形任务而设计的一种ASIC(专用集成电路)。一台计算机,只有 GPU 是不能运行的,但是只有 CPU 可以。
  2. 硬件模块之间的区别:CPU 运算能力特别强的 ALU。大的缓存用来降低访问数据的延时。有复杂的控制模块来分支预测。和对流水线中被前面指令过慢被后续指令依赖的数据做数据转发;GPU 的特点是有很多但计算能力不高的 ALU 。少量的缓存,目的是针对在众多线程中请求相同数据时,进行请求合并,然后再向 DRAM 请求数据并更新,在获取数据之后会转发到对应的线程中。 访问 DRAM 不可避免的会造成一定程度的延时。GPU的虽然有dram延时,却有非常多的ALU和非常多的thread. 为了平衡内存延时的问题,我们可以中充分利用多的ALU的特性达到一个非常大的吞吐量的效果。尽可能多的分配多的Threads.通常来看GPU ALU会有非常重的pipeline就是因为这样。
  3. 从图上可以看出来,GPU 有特别多的计算单元,以及超长流水线,较为简单的控制模块和缓存。主要目的就是为了处理大量计算方式相似但是数据之间不相互依赖的任务,比如图像中的像素点。通常 CPU 可以处理 2D 的图像,但是复杂的 3D 图形计算,还是使用专门是设计用于此任务的 GPU 更为适合。同时 GPU 的并行计算架构也适合于密码破译,大数据处理,金融分析等领域。
  4. CPU擅长逻辑控制,串行的运算。和通用类型数据运算不同,GPU擅长的是大规模并发计算,这也正是密码破解等所需要的。所以GPU除了图像处理,也越来越多的参与到计算当中来。

什么是 CPU

最为早期的 CPU 其实是针对固定大型应用被定制的。但是发展到现代,CPU 更多的是一种为了通用处理更多样任务而制造的。所以他有数量不多,但性能很强大的核心,用来处理计算任务。

什么是 GPU

GPU 是在 CPU 日益复杂的任务中发展出来的。某些芯片制造公司在发现 CPU 的任务之中,经常性的处理某些特定的任务(比如游戏渲染,密码破解等),针对这种场景专门设计了 GPU 的架构来优化相关任务的计算速度。

什么是数据转发

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

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

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

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

参考

  1. CPU和GPU的设计区别 https://www.cnblogs.com/biglucky/p/4223565.html
  2. 【Java深入学习系列】之CPU的分支预测(Branch Prediction)模型 https://segmentfault.com/a/1190000006889989
  3. 阿里程序员工作小技巧:理解 CPU 分支预测,提高代码效率 https://www.infoq.cn/article/g5vcecw7bp4rgxsru-j8
  4. CPU、GPU、FPGA、ASIC芯片的对比 https://kknews.cc/tech/ngvlz45.html