Main Content

利用并行计算提高性能

影响速度的因素

一些因素可能会影响并行处理的执行速度:

  • 并行开销。调用 parfor 而不是 for 会产生开销。如果函数计算很快,这种开销可能会变得相当可观。具体来说,并行求解问题可能比串行求解问题更慢。

  • 不能有嵌套的 parfor 循环。这是在 嵌套并行函数 中描述的。当从另一个 parfor 循环中调用时,parfor 不能并行工作。如果您已经对目标或约束函数进行了编程以利用并行处理,则没有嵌套 parfor 循环的限制可能会导致求解器的运行速度比您预期的要慢。特别是,有限差分的并行计算优先,因为那是一个外循环。这会导致目标或约束函数内的任何并行代码按顺序执行。

  • 当串行执行时,parfor 循环比 for 循环运行得慢。因此,为了获得最佳性能,请确保只有最外层的并行循环调用 parfor。例如,假设您的代码在 parfor 循环内调用 fmincon。为了在这种情况下获得最佳性能,请将 fmincon UseParallel 选项设置为 false

  • 传递参数。在执行并行计算期间,参数会自动传递给工作进程机器。如果参数数量很多或者占用大量内存,传递它们可能会减慢计算的执行速度。

  • 资源争夺:网络和计算。如果工作进程机器的网络带宽低或延迟高,计算速度可能会变慢。

影响结果的因素

使用并行处理时,一些因素可能会影响数值结果。并行 for 循环 (parfor) (Parallel Computing Toolbox) 中列出了更多与 parfor 相关的注意事项。

  • 持久变量或全局变量。如果您的目标或约束函数使用持久或全局变量,这些变量在不同的工作进程处理器上可能会采用不同的值。此外,它们可能无法在工作进程处理器上被正确清除。求解器可能会抛出诸如尺寸不匹配之类的错误。

  • 访问外部文件。在并行计算期间,外部文件可能会以不可预测的方式被访问。并行处理期间无法保证计算的顺序,因此可能会以不可预测的顺序访问外部文件,从而导致不可预测的结果。

  • 访问外部文件。如果两个或多个处理器同时尝试读取外部文件,则该文件可能会被锁定,导致读取错误,并停止优化的执行。

  • 如果您的目标函数调用 Simulink®,并行梯度计算的结果可能不可靠。

  • 非计算函数(例如 inputplotkeyboard)在用于目标约束函数时可能会表现不佳。当在 parfor 循环中调用时,这些函数在工作进程机器上执行。这可能会导致工作进程失去反应,因为它正在等待输入。

  • parfor 不允许 breakreturn 语句。

寻找全局最优

为了寻找全局最优解,一种方法是从各种初始点来评估求解器。如果使用 parfor 函数将这些评估分布在多个处理器上,则会禁用并行梯度计算,因为 parfor 循环不能嵌套。如果将评估分布在所有处理器上,而不是使用并行梯度计算以串行方式运行,则优化通常会运行得更快,因此禁用并行估计可能不会减慢计算速度。但是,如果处理器的数量比初始点的数量多,则不清楚是分布初始点更好还是启用并行梯度计算更好。

如果您有Global Optimization Toolbox许可证,您可以使用 MultiStart (Global Optimization Toolbox) 求解器并行检查多个起点。请参阅并行计算 (Global Optimization Toolbox)并行 MultiStart (Global Optimization Toolbox)

相关主题