Java 并发CPLEX进程比单个进程慢得多

Java 并发CPLEX进程比单个进程慢得多,java,concurrency,parallel-processing,cplex,Java,Concurrency,Parallel Processing,Cplex,我正在使用单线程CPLEX和Java(Linux下)对线性程序(LP)进行建模和求解。我的目标是在并行线程中解决多个小LP,理想情况下每个内核独立解决一个LP 问题是并行求解两个或多个LP要比求解单个LP慢得多。在一个非常简单的测试中,我同时启动了多个相同的进程来解决同一个LP。启动单个进程和启动多个进程之间的运行时差异很大: 1过程:180秒 2个过程:225秒 3道工序:280秒 类似地,从同一进程启动多个线程以同时求解多个LP比求解单个LP慢得多 我怀疑内存访问可能是瓶颈,但测试一段经

我正在使用单线程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版。

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

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


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

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

我看到的是更快,而不是更慢。1个过程在180秒内解决了1个问题。2个流程解决2个225s=112.5s/问题(更快)。3解决了280分之3=93.3s/问题(速度更快,几乎是一个过程速度的两倍)。或者你已经在给出的数字中进行了划分了吗?你是对的,但是看到这些进程是完全独立的,没有同步问题可言,我本以为两个或三个进程所需的时间与一个进程所需的时间大致相同。谢谢。你的观点是正确的,但我要指出的是,我希望我的问题具有良好的可扩展性,因为每个优化都在其自己的操作系统级进程中运行,因此肯定没有同步,只涉及调度。CPLEX需要运行时来解决这个问题,我的假设是这个库是可靠实现的。我运行的另一个测试通过同样的方法显示了内存密集型代码段的线性可伸缩性。您假设实现CPLEX库是为了在多线程系统中可伸缩。谁能保证呢。此外,如果没有完整的代码视图,任何工具都无法帮助您。这是Stackoverflow,该网站关注计算机编程问题。让我说,这里没有计算机编程问题。我可以看到您如何创建cplex实例,如何提交模型等。因此,所有答案都是理论性的。没有实际的答案可以提供!对不起,是的,我实际上是这么想的,显然我过于乐观了。我没有包含任何代码,因为我的问题是行为问题,而不是与一段明显的代码相关。因此,我期待的是理论上的答案。非常感谢您的帮助。@elcomandantetibi我很乐意帮助解决与CPLEX相关的编程问题。我不使用并行模式:对于我的问题,barrier算法要慢得多,我知道最有效的参数是:带预解的dual或不带预解的primalpresolve@DavidNehme此外我知道他是在用不同的输入参数同时运行同一个模型,而不是在用CPLEX开发同一实例的并行求解。@JeanValjean我知道,他想用一个线程和6个核运行多个模型,3个并行求解的速度应该和1一样快。问题是CPLEX在默认情况下确实试图利用多个内核,因此除非在每个CPLEX实例上设置参数,否则CPLEX将使用多个线程来竞争资源。@DavidNehme假设我理解了这个问题。。。但是,他可以尝试更改一些cplex参数。我建议的
并行模式开关
参数可能有用。另一个参数与CPLEX实例调用的线程数有关(请参阅)。@DavidNehme此外,他可以阅读关于线程和性能的考虑。