居然不知道什么是并行计算?

570 阅读4分钟

什么是并行计算?

如题,什么是并行计算?

——经常听说GPU适合并行计算,CPU不行,那么并行计算、串行计算、CPU、GPU到底有什么关系?

从最基本的入手,什么是串行计算?

串行计算

如今大部分的计算机都是采用冯诺依曼架构,即处理器从存储器中“取出指令、执行指令(包括解码指令)、取出指令”如此循环。于是对于一个问题而言,CPU对其解决时,就只能一个一个指令的执行,见下:

img

于是问题解决的快慢就取决于两个因素:CPU运算速度、数据读取速度。应对这两个问题,逐渐出现了带有缓存、多核的处理器。

img

但是缓存不可能无限制增大,继续增大反而会造成性能下降(过大的缓存,速度/成本必然不尽人意)。

后来发明的SMT架构、多线程、超线程架构,使得处理器可以同时运算多个数据,这种指令和数据的关系又(福林Flynn)分为:SISD,SIMD,MISD,MIMD。

  • SISD:单指令单数据,传统意义上的串行处理就是这种;
  • SIMD:单指令多数据,指令流并发的广播到多个处理器上,每个处理器拥有各自的数据流,处理器内存只需要一套逻辑来对这个指令流进行解码和执行,而无需多个指令解码通道;
  • MISD:多指令单数据,仅有概念;
  • MIMD:多指令多数据,每个处理单元拥有自己的指令流,并且这些指令流操作自己的数据流,大部分并行系统的类型;

img

值得注意的是,冯诺依曼体系的多线程并发(即同时运行多个线程/进程),宏观上是并行,微观是串行,即分时复用而已。真正意义上的并行计算还是得依靠多处理器架构。比如我们所熟知的GPU。

并行计算

利用多核提升程序性能通常需要对计算密集型代码进行一些处理:

  • 将代码划分成块。
  • 通过多线程并行执行这些代码块。
  • 结果变为可用后,以线程安全和高性能的方式整合这些结果。

传统多线程结构虽然实现功能,但难度颇高且不方便,特别是划分和整理的步骤(本质问题是:多线程同时使用相同数据时,出于线程安全考虑进行锁定的常用策略会引发大量竞争)。

img

而并行框架(Parallel Framework)专门用于在这些应用场景中提供帮助。

CPU与GPU内部的架构区别显而易见:

img

CPU缓存大、逻辑运算ALU较少;GPU逻辑运算较多,缓存较小。相较之下,GPU有更多的运算单元,即干活的人多了。一个更细致的GPU并行计算架构如下:

img

该图表示,计算网格由多个流处理器构成每个流处理器又包含 n 多块。下面进一步对 GPU 计算网格中的一些概念做细致分析

\1. 线程

线程是 GPU 运算中的最小执行单元,线程能够完成一个最小的逻辑意义操作。

\2. 线程束

线程束是 GPU 中的基本执行单元。GPU 是一组 **SIMD 处理器的集合,因此每个线程束中的线程是同时执行的。**这个概念是为了隐藏对显存进行读写带来的延迟所引入的。

\3. 线程块

一个线程块包含多个线程束,在一个线程块内的所有线程,都可以使用共享内存来进行通信、同步。但一个线程块能拥有的最大线程/线程束,和显卡型号有关。

\4. 流多处理器

流多处理器就相当于 CPU 中的核,负责线程束的执行。同一时刻只能有一个线程束执行。

\5. 流处理器

流处理器只负责执行线程,结构相对简单。

另外,GPU架构和CPU最大的不同在内存系统上。

若想进一步了解Nvidia显卡的信息:

zhuanlan.zhihu.com/p/61358167?…

讲的还算可以的GPU并行编程:

blog.csdn.net/llsansun/ar…

CPU并行与GPU并行的区别:

www.cnblogs.com/muchen/p/62…

(重点)GPU并行编程的优化:

www.cnblogs.com/muchen/p/62…

参考链接

GPU并行编程:www.cnblogs.com/muchen/p/61…

blog.csdn.net/qq_25985027…

www.cnblogs.com/leokale-zz/…

www.cnblogs.com/jonins/p/95…