并行算法设计
并行算法设计
假定已有求解问题的串行算法,我们将 其改为并行版本
- 并不一定是最好的策略——有些情况下,最 优并行算法与最优串行算法完全没有关系
- 但很有用,我们很熟悉串行算法,很多时候 是切实可行的方法
并行算法与体系结构紧密相关!
任务分解、数据依赖、竞争条件
设计一个并行算法
- 计算任务的分解
❑ 如何将并行计算工作分解,交由众多进程/线程并发执行 - 保持依赖关系
❑ 计算结果与串行算法保持一致 - 额外开销
❑ 有多种类型的开销,要尽量降低
竞争条件与数据依赖
- 执行结果依赖于两个或更多事件的时序, 则存在竞争条件(race condition)
- 数据依赖(data dependence)就是两个内 存操作的序,为了保证结果的正确性,
必须保持这个序 - 同步(synchronization)用来将多个线程 的执行串行化,或是将并发数据访问串
行化
n 个数求和的例子
1.串行算法
sum = 0;
for (i = 0; i < n; i++) {
x = Compute next value(. . .);
sum += x; }
2. 并行算法
版本1:计算任务划分
假定每个核心计算连续n/t个元素的部分和(t为线程数或处理器数)