【问题标题】:Concurrent CPLEX processes a lot slower than single process并发 CPLEX 进程比单个进程慢很多
【发布时间】:2013-06-08 04:14:19
【问题描述】:

我正在使用单线程 CPLEX 和 Java(在 Linux 下)对线性程序 (LP) 进行建模和求解。我的目标是在并行线程中解决多个小型 LP,理想情况下每个内核独立解决一个 LP。

问题在于并行求解两个或多个 LP 比求解单个 LP 慢很多。在一个非常简单的测试中,我同时启动了多个相同的进程来解决相同的 LP。启动单个进程和启动多个进程之间的运行时差异很大:

  • 1 个进程:180 秒
  • 2 个进程:225 秒
  • 3 个进程:280 秒

同样,从同一个进程启动多个线程同时求解多个 LP 比求解单个 LP 慢很多。

我怀疑内存访问可能是瓶颈,但测试一段经常读写内存的代码会产生相当的运行时间:

  • 1 个进程:87 秒
  • 2 个进程:85 秒
  • 3 个进程 88 秒

知道什么可能导致缓慢吗?

我正在运行的机器有 6 个内核和大量内存以避免任何交换。 IBM ILOG Cplex 库是 12.5 版。

【问题讨论】:

  • 我看到的速度更快,而不是更慢。 1 个过程在 180 年代解决了 1 个问题。 2 个进程在 225 秒内解决了 2 个问题 = 112.5 秒/问题(更快)。 3 在 280 中解决了 3 = 93.3 秒/问题(更快,几乎是一个过程的两倍)。还是您已经按照您给出的数字进行了除法?
  • 你是对的,但是看看进程是如何完全独立的,没有同步问题可言,我原以为两个/三个进程所花费的时间与一个进程大致相同.

标签: java concurrency parallel-processing cplex


【解决方案1】:

如果您启用了多个线程,CPLEX 将使用并发优化器。这意味着它在一个线程中运行对偶单工,而在其余其他线程中运行屏障算法。 CPLEX 报告首先完成的算法的答案。因此,如果您有 6 个内核,那么它​​可能使用 1 个线程用于双单工,5 个线程用于屏障。当您尝试同时解决 3 个 LP 时,它们会互相窃取循环。您可以通过将参数 RootAlg 设置为 2 来仅使用对偶单纯形法(始终只使用 1 个线程)。您还可以设置参数 AuxRootThreads 来限制每个 LP 求解使用的线程数。 您应该检查哪种算法(Primal、Dual 或 Barrier)更适合您的问题。如果可以利用多个线程的 Barrier 工作得最好,您最好串行运行每个模型并让 CPLEX 进行并行化。

【讨论】:

  • 我没有使用并行模式:障碍算法对于我的问题要慢得多,而且我知道最有效的参数:双预解或原始无预解
  • @DavidNehme 此外,我了解到他正在同时运行具有不同输入参数的相同模型,而不是使用 CPLEX 来利用同一实例的并行求解。
  • @JeanValjean 我明白了,他想运行多个模型,每个模型都有一个线程和 6 个内核,3 个并行求解的运行速度应该与 1 一样快。问题是 CPLEX 确实默认尝试利用多个核心,因此除非您在每个 CPLEX 实例上设置参数,否则 CPLEX 将使用多个线程来竞争资源。
  • @DavidNehme 假设我理解了问题......但是,他可以尝试更改一些 cplex 参数。我建议的parallel mode switch 参数可能很有用。另一个参数与 CPLEX 实例调用的线程数有关(请参阅global default thread count)。
  • @DavidNehme 此外,他可以阅读有关线程和性能的注意事项here
【解决方案2】:

首先,让我强调T.J.Crowder 的评论是正确的。一般来说,真正的加速在多线程方法中不可能是线性的。事实上,请考虑:1)机器上运行的其他进程,不仅仅是你的; 2)CPU架构很重要,还有其他硬件(主板、RAM等),那么这些可能会影响你算法的性能。

我建议使用 CPLEX 中包含的几个选项,例如与parallel mode switch

最后,另一个重要的考虑因素是关于您的问题:您假设您的实施是好的,但没有证据表明这一点。

【讨论】:

  • 谢谢。您的观点是正确的,但让我指出,我期待我的问题具有不同的良好可扩展性,因为每个优化都是在操作系统级别的自己的进程中运行的,因此肯定没有同步,只涉及调度。运行时是 CPLEX 解决问题所需要的,我的假设是该库已得到可靠实现。我运行的另一个测试确实通过相同的方法显示了一段内存密集型代码的线性可伸缩性。
  • 您假设实现 CPLEX 库是为了在多线程系统中可伸缩。谁能保证这一点。此外,如果没有完整的代码视图,没有人可以帮助您。这是 Stackoverflow,该站点专注于计算机编程问题。让我说这里没有计算机编程问题。我可以看到您如何创建 cplex 实例、如何提交模型等。因此,所有答案都是理论上的。无法提供实际答案!对不起
  • 是的,我实际上是这样假设的,显然我过于乐观了。我没有包含任何代码,因为我的问题是行为问题,而不是与一段明显的代码有关。因此,这是我所期待的理论答案。不过,非常感谢您的帮助。
  • @elcomandantetibi 我很乐意帮助解决与 CPLEX 相关的编程问题。
猜你喜欢
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2016-03-02
  • 2016-07-03
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多