为什么并行求解器比顺序求解器慢?


14

我在玩PETSc时发现,当我通过MPI用多个进程运行程序时,它的运行速度甚至会变慢!我该如何查看发生了什么?


不要将其发布为答案,因为它实际上是“什么”而不是“如何”,但是过去我也遇到过类似的问题,这是由于从多个线程访问互斥保护的代码段引起的。有时您必须检查幕后共享资源是否锁定。
David Z

Answers:


13

这可能是由于架构因素引起的:

如果相同的内存带宽可用于一个或多个进程,则您几乎看不到加速,因为SpMV和相关的线性代数运算受内存带宽限制。

通信开销也可能使您的本地计算不堪重负。例如,在线性迭代方法中,我们建议每个过程至少有10,000个未知数。

数值因素:

并行预处理器通常比串行预处理器弱。例如,您使用的块越多,雅可比块就越弱。因此,您需要考虑花费在额外的线性迭代上的额外时间。非线性条件通常无法以这种方式工作,因此牛顿迭代通常是恒定的。


8

每当尝试并行化程序时,您都必须平衡许多成本,但主要是

  • 运行每次计算的成本
  • 这些计算之间的任何通信成本
  • 管理这些计算的成本

如果您的计算令人尴尬地并行,那么通信成本将非常低(仅输入和输出),并且管理成本也将非常低。

如果计算之间存在相互依赖性,则通信成本可能会大大增加。如果您有一个复杂的算法,对于任何给定的计算都需要花费不同的时间才能完成,那么当您尝试有效利用现有资源时,管理的复杂性就会提高。

与任何形式的优化一样,关键是进行基准测试。查看不使用MPI时的性能,使用MPI和一个流程时的性能,然后查看其扩展方式。

如果您正在使用CUDA打,试着给它多少更多的数据。此处的一项测试导致负加速。我们为它提供了1000倍的数据,并且GP-GPU版本几乎同时完成,而运行在主CPU上的版本花费了1000倍的时间。


3

我建议您执行以下操作:

  • 使用和不使用并行化,对代码的时间执行情况进行概要分析。如果您对如何执行操作有疑问,可以更好地描述您的代码,我们将为您提供帮助。

  • 现在,您可以专注于并行运行较慢的部分。您应该意识到,进程之间的通信可能很慢。正如Mark和Sean所指出的那样,仅仅将问题划分为多个线程并不意味着这样做会很有效。您必须更深入地研究它。但是,如果您分析代码,则可能会帮助您查找任何现有的错误。我的两分钱。

如果您更详细地说明正在执行的操作(例如,使用工作流程),则可能有人可以为您提供更好的说明。


@ketch:你是对的。抱歉,谢谢。编辑了文字。
jbcolmenares 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.