基于任务的程序设计(17)

1.6.3  并行化任务 

Visual C# 2010和.NET Framework 4使得将基于任务的设计转换为并行化代码变得非常简单。然而,很重要的一点在于,为了让并行化的代码能够实现预期的目标,必须对并行化的代码进行特别的测试和调优。本书剩余的部分将讲解这些主题。

当您对任务进行并行化时,并行化所引入的开销可能产生较大的影响,因此,可能需要对多种可替换方案进行测试。如前所述,现代的多核微处理器极其复杂,在做出最终选择之前,有必要对不同的并行化技术进行测试。事实上,串行代码也是如此,但是区别在于,您已经知道foreach循环比for循环要慢。在对任务进行并行化的时候,根据决定并行化任务执行的方式的特定参数的不同,并行化版本的for循环可能会产生不同的性能结果。一旦经历过这些场景之后,您就能够在为类似问题编写代码和进行相似的任务设计的时候考虑到这些问题。

通常情况下都有必要将多个任务连接起来,其中,代码可以将要完成的工作分解为子任务、并行地执行子任务、收集结果,然后重复很多像这样的循环。在决定并行化对某一个特定的问题来说是否是好的替代方案的时候,想象要在1000个内核上运行,尝试创建一个可能的并发执行的示意图。如果算法中可以完全并行化的部分不能提供预期的可扩展性,那么您还可以让它们与其他任务一起并行运行。

1.6.4  尽量减少临界区

Amdahl法则和Gustafson法则都意识到,串行工作是并行算法整体性能的敌人。在两个并行部分之间需要顺序执行的串行时间段称为临界区(critical section)。图1-16标出了用于分析Gustafson法则的一个示意图中的4个临界区。

读书导航