1.8 判断是否适合并行化
有时,并行化并不是优化算法的最佳选择。如果相比于串行执行的方式,并行化能够带来显著的性能提升,那么并行化才有意义。判断是否适合并行化并没有一劳永逸的方法——一切都取决于特定问题的功能需求和性能需求。例如,如果一个并行化的算法完成整个作业的时间能够减少30%,而如果串行版本的算法只需要不到1秒就可以完成,那么这个加速就不明显了。然而,如果对一个需要运行18个小时才能完成的批处理作业进行并行化加速也能达到如此的性能提升,那么加速之后不到13小时就能完成运行了,这样的话并行化的意义就很显著。
您还可以考虑通过并行化执行来向现有的应用程序添加新功能。通过可以充分发挥并行化优势的异步任务和线程,可以设计出对用户的响应能力更好的方案。
并行化程序设计比传统的串行程序设计复杂得多。然而,只要您开始进行基于任务的设计,并且编写并行化代码之后,就很难不再去想并行化了。
Visual C# 2010和.NET Framework 4提供了很多特性,使得从基于任务的设计到并行化代码成为可能;本书剩余的部分将会对这些特性进行深入讲解,并且会帮助解决这个转变过程中可能遇到的所有问题。
1.9 小结
本章介绍了共享内存的多核体系结构和NUMA体系结构。首先解释了新的轻量级并发和并行模型的细节,并且阐述了在编写代码之前以并行的思想指导设计方案的必要性。然后还讨论了一些与并行优化和可扩展性局限性相关的经典法则。本章的主要内容包括:
● 将算法分解为并行的任务可以充分地发挥多硬件线程的优势。
● 可以使用更加简洁且高效的轻量级并发模型。
● 通过改进设计,可以避免Amdahl法则所描述的可扩展性的局限性。
● 可以考虑Gustafson法则。
● 必须尽可能地减少临界区,临界区会限制可扩展性。
● 在设计的时候要以并发、交错并发和并行化的思想作为指导。
● 必须考虑代码并行化带来的开销。
● 在使用NUMA体系结构的时候,可能会面临异常的性能问题。
● 在编写并行化代码的时候,要考虑目前已经学习的所有与现代硬件体系结构相关的知识。