并发CPLEX流程比单个流程慢很多

时间:2013-06-12 06:25:44

标签: java concurrency parallel-processing cplex

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

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

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

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

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

  • 1个过程:87秒
  • 2个过程:85秒
  • 3个流程88 s

知道什么可能导致缓慢?

我运行的机器有6个核心和足够的内存,以避免任何交换。 IBM ILOG Cplex库是12.5版。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

最后,另一个重要的考虑是你的问题:你假设你的实施是好的,但没有证据。