CPU与GPU并行计算联系与区别

最近在做利用GPU实现并行渲染的工作,前天同学问我CPU和GPU在多线程和并行计算方面的区别具体是什么,虽然做了几个月这方面的工作,但我一下子答却不知道从何答起,因此在这里做一下整理。

一、CPU和GPU的区别

(图片来源于网络,文字参考(侵删):https://www.renderbus.com/share/post-id-1478

CPU((Central Processing Unit, 中央处理器):CPU的结构主要包括运算器(ALU, Arithmetic and Logic Unit)、控制单元(CU, Control Unit)、寄存器(Register)、高速缓存器(Cache)和它们之间通讯的数据、控制及状态的总线。需要具备处理不同数据类型的能力,具有很强的通用性,CPU内部结构非常复杂。CPU擅长像操作系统、系统软件和通用应用程序这类拥有复杂指令调度、循环、分支、逻辑判断以及执行等的程序任务。它的并行优势是程序执行层面的,程序逻辑的复杂度也限定了程序执行的指令并行性,上百个并行程序执行的线程基本看不到。

CPU架构图

CPU架构图解

GPU(Graphics Processing Unit,图形处理器):GPU由数量众多的计算单元和超长的流水线组成,适合处理大量的类型统一的数据。但GPU无法单独工作,必须由CPU进行控制调用才能工作。GPU以图形类数值计算为核心。用于处理类型高度统一、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。GPU擅长的是图形类的或者是非图形类的高度并行数值计算,GPU可以容纳上千个没有逻辑关系的数值计算线程,它的优势是无逻辑关系数据的并行计算。

GPU中有很多的运算器ALU和很少的缓存cache,缓存的目的不是保存后面需要访问的数据的,而是为线程thread提高服务的。如果有很多线程需要访问同一个相同的数据,缓存会合并这些访问,然后再去访问dram。

GPU架构图

关于CPU与GPU计算的对比视频:https://v.youku.com/v_show/id_XNjY3MTY4NjAw.html

二、多进程、多线程、并发、并行

(参考(侵删):https://blog.csdn.net/qq_33290787/article/details/51790605

1.进程(活动)

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。多进程,就好比同时打开了Word,Excel和Visio,他们都是不同的程序运行活动,即多个进程同时启动而已。

2.线程(执行路径)

线程,是一个执行中的程序活动(即进程)的多个执行路径,执行调度的单位。线程依托于进程存在,在进程之下,可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈。多线程,指在一个进程下有多个线程。各个线程执行自己的任务,这些线程可以“同时进行”。多线程强调”同时,一起进行“,而不是单一的顺序操作。

3.并发

并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序(或线程)之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。也就是说对于一个CPU资源,线程之间竞争得到执行机会。

4.并行

指两个或两个以上事件(或线程)在同一时刻发生,是真正意义上的不同事件或线程在同一时刻,在不同CPU资源上(多核),同时执行。

这里引用知乎网友@pansz的比喻:

单进程单线程:一个人在一个桌子上吃菜。
单进程多线程:多个人在同一个桌子上一起吃菜。
多进程单线程:多个人每个人在自己的桌子上吃菜

三、CPU与GPU的并行计算

(参考1(侵删):https://www.cnblogs.com/fengfu-chris/p/4357821.html

   参考2(侵删):https://www.cnblogs.com/muchen/p/6297166.html

并行计算一般有两个维度,一个是指令(Instruction)或程序(Program),另一个是数据(Data)。这样,就可以归纳出各种并行模式(S代表Single,M代表Multiple)。

并行计算

除了SISD,其他几个都算是并行计算方法。

数据的存储可以分为两大类:分布式存储和共享内存。分布式存储意味着不同的进程/指令处理不同的数据,大家互相不干扰。共享内存则要求不同的进程/指令可以同时修改同一块数据,进程之间的通信将变得简单,缺点是容易造成数据读写冲突而需要谨慎对待。

1.CPU并行计算

CPU 采用复杂的分支预测技术来达到并行计算目的。对于CPU并行计算,缓存对程序员透明。应用程序员无法通过编程手段操纵缓存。采用 MIMD - 多指令多数据类型。多条指令构成指令流水线,且每个线程都有独立的硬件来操纵整个指令流。

2.GPU并行计算

GPU最大的特点是它拥有超多计算核心,往往成千上万核。而每个核心都可以模拟一个CPU的计算功能,虽然单个GPU核心的计算能力一般低于CPU。对于GPU并行计算,缓存对程序员不透明,程序员可根据实际情况操纵大部分缓存。采用 SIMT - 单指令多线程模型,一条指令配备一组硬件,对应32个线程 (一个线程束)。GPU 内部有很多流多处理器。每个流多处理器都相当于一个“核",而且一个流多处理器每次处理 32 个线程。

CUDA,全称是Compute Unified Device Architecture,即统一计算架构,是由生产GPU最有名的英伟达公司提出的CPU+GPU混合编程框架。CUDA C/C++语言有如下特点:也是SPMD框架,兼有分布式存储和共享内存的优点,把握GPU的带宽是充分利用GPU计算资源的关键。

一般,经过一定优化的CUDA C/C++程序的计算速度相比于传统的CPU程序的计算速度要快几倍到几十倍。

猜你喜欢

转载自blog.csdn.net/ljytower/article/details/83024517