什么是并行计算?
如题,什么是并行计算?
——经常听说GPU适合并行计算,CPU不行,那么并行计算、串行计算、CPU、GPU到底有什么关系?
从最基本的入手,什么是串行计算?
串行计算
如今大部分的计算机都是采用冯诺依曼架构,即处理器从存储器中“取出指令、执行指令(包括解码指令)、取出指令”如此循环。于是对于一个问题而言,CPU对其解决时,就只能一个一个指令的执行,见下:
于是问题解决的快慢就取决于两个因素:CPU运算速度、数据读取速度。应对这两个问题,逐渐出现了带有缓存、多核的处理器。
但是缓存不可能无限制增大,继续增大反而会造成性能下降(过大的缓存,速度/成本必然不尽人意)。
后来发明的SMT架构、多线程、超线程架构,使得处理器可以同时运算多个数据,这种指令和数据的关系又(福林Flynn)分为:SISD,SIMD,MISD,MIMD。
- SISD:单指令单数据,传统意义上的串行处理就是这种;
- SIMD:单指令多数据,指令流并发的广播到多个处理器上,每个处理器拥有各自的数据流,处理器内存只需要一套逻辑来对这个指令流进行解码和执行,而无需多个指令解码通道;
- MISD:多指令单数据,仅有概念;
- MIMD:多指令多数据,每个处理单元拥有自己的指令流,并且这些指令流操作自己的数据流,大部分并行系统的类型;
值得注意的是,冯诺依曼体系的多线程并发(即同时运行多个线程/进程),宏观上是并行,微观是串行,即分时复用而已。真正意义上的并行计算还是得依靠多处理器架构。比如我们所熟知的GPU。
并行计算
利用多核提升程序性能通常需要对计算密集型代码进行一些处理:
- 将代码划分成块。
- 通过多线程并行执行这些代码块。
- 结果变为可用后,以线程安全和高性能的方式整合这些结果。
传统多线程结构虽然实现功能,但难度颇高且不方便,特别是划分和整理的步骤(本质问题是:多线程同时使用相同数据时,出于线程安全考虑进行锁定的常用策略会引发大量竞争)。
而并行框架(Parallel Framework)专门用于在这些应用场景中提供帮助。
CPU与GPU内部的架构区别显而易见:
CPU缓存大、逻辑运算ALU较少;GPU逻辑运算较多,缓存较小。相较之下,GPU有更多的运算单元,即干活的人多了。一个更细致的GPU并行计算架构如下:
该图表示,计算网格由多个流处理器构成,每个流处理器又包含 n 多块。下面进一步对 GPU 计算网格中的一些概念做细致分析:
\1. 线程
线程是 GPU 运算中的最小执行单元,线程能够完成一个最小的逻辑意义操作。
\2. 线程束
线程束是 GPU 中的基本执行单元。GPU 是一组 **SIMD 处理器的集合,因此每个线程束中的线程是同时执行的。**这个概念是为了隐藏对显存进行读写带来的延迟所引入的。
\3. 线程块
一个线程块包含多个线程束,在一个线程块内的所有线程,都可以使用共享内存来进行通信、同步。但一个线程块能拥有的最大线程/线程束,和显卡型号有关。
\4. 流多处理器
流多处理器就相当于 CPU 中的核,负责线程束的执行。同一时刻只能有一个线程束执行。
\5. 流处理器
流处理器只负责执行线程,结构相对简单。
另外,GPU架构和CPU最大的不同在内存系统上。
若想进一步了解Nvidia显卡的信息:
zhuanlan.zhihu.com/p/61358167?…
讲的还算可以的GPU并行编程:
CPU并行与GPU并行的区别:
(重点)GPU并行编程的优化:
参考链接
GPU并行编程:www.cnblogs.com/muchen/p/61…