设计并行算法的一个基本的步骤是描述完成给定任务所需要的计算,并把这些计算分解为可以并行执行的子任务集。对很多的问题来说,它们的任务图都包含了足够的并行性。对这样的任务图,各个任务可以在多个处理器上进行调度,从而使得问题得以并行的完成。但不幸的是,很多的问题的任务图中并不表现出如此丰富(或者称为直观)的并行性,相反的,它们往往包含一个任务或者多个需要串行执行的任务。对这样的问题,我们需要将总的计算任务进行分解为一个可以并行执行的子任务集,这个过程称为任务分解。一个好的任务分解应该具有下面的特点:

  ☆ 它应该有很高的并行度。并行度越高意味着这个分解后的任务可以在越多的处理器上并行的执行。
  ☆ 子任务间的交互(通信和同步)应该尽可能的少。交互少意味着处理器可以更专心的完成任务本身而不是其它由于通信和同步带来的额外计算和等待。

  很多情况下,这两个要求会产生冲突,也就是说,有很高的并行度的任务分解,通常需要子任务间的大量交互操作。如何平衡冲突是并行算法设计中的艺术。这一节中主要考虑如何提高子任务的并行度,关于子任务间的交互的讨论在下一节进行。

  下面介绍几种用于任务分解的常用的方法。对不同的问题,这些方法并不总是可行,而且也不一定会得到最有的并行算法,但对很多问题来说,这些方法可以提供一个好的并行化的"着眼点"。

  其中的递归分解和数据分解可以被看成是相对通用的分解方法,因为它们可以用来对大多数的问题进行任务分解,而搜索分解要特殊一些,它只能应用于某些特定类型的问题。