并行编程
1. 并发与并行的区别
- 并发是多个任务抢占相同的CPU(不同时);
- 并行系统同时运行多个任务在不同的CPU上;
2. 并行编程内的交流
两种:共享状态(信号量等)和消息传递。
- 共享状态:多个并行任务共享一个变量
- 消息传递:尽管内存使用率高,但消息传递杜绝了并行获取共享变量的情况
3. 并行编程的问题
死锁 deadlock
死锁是多个进程等待某个条件释放它们的任务,但是这种条件永远不会发生。
饥饿 starvation
因为在处理进程优先级时的不合理排序,可能导致某些进程永远不能被执行。
竞争条件 race conditions
并行程序存在不确定性,即你不能确定哪个进程先执行,哪个进程先结束。不确定性导致如果程序里缺少某些同步机制,竞争条件便会发生。
并行程序要求某些步骤一定要是原子的。假设我们有一个过程:
- 读余额
- 加20元
- 写新余额
如果不把这三步定义为原子的,多进程并行这段代码时很可能发生错误。
4. 设计并行算法
数据分解
将数据分为独立的多部分,然后并行处理每个部分
使用pipline分解任务
pipline的每一个阶段都有自己的可以以并行方式运行的workers。然而,每个阶段的workers之间需要实现数据交换。如下图:
在分解任务啊的时候要注意:
- 识别独立的任务;
- 识别任务之间的数据交换;
Ref:
《Parallel Programming with Python》