并发编程1:数据并行

116 阅读1分钟

数据并行是最简单的一种并发。这里说的简单不是实现难度、优化难度上的容易,而是需要协调、同步的点最少。完全不需要协调的N个程序各自运行,虽然从字面意思上也可以称之为并发,但就不在我们的讨论范围之内了。

并发编程解决的关键问题是让独自运行的程序在恰当的时间点上以恰当的方式协调。

Merge Sort是一个经典的数据并行例子。数组左边和右边可以单独排序,这时就可以开启两个线程来并行计算,协调的步骤在于两边都排序结束后,要合并到一起。

具体的代码放在了GitHub。小伙伴们也可以在B站看具体代码的诞生过程

机器学习也是非常常见的数据并行案例。之所以可以在GPU等矩阵运算加速硬件上进行,是因为矩阵运算是由大量彼此独立的向量运算组成的,所以每一组向量运算是可以并发执行的。

总之,需要协调的事情越少,并行计算的可能性以及并行量也就越高。随之带来的速度提升也就越多。 相反,如果一个问题的各个组成部分有明显的时间先后顺序、或者逻辑依赖关系,那么就很难去并行计算。所以这样的问题开启多个线程常常无法带来速度的提升。这也是初学者在做并发编程时常常走入的误区。