我使用单线程CPLEX和Java(在Linux下)建模和解决线性程序(LP)。我的目标是在并行线程中解决多个小LP,理想情况是每个核心独立地解决一个LP。
问题是并行解决两个或多个LP比解决单个LP要慢很多。在一个非常简单的测试中,我同时启动了多个相同的过程来解决相同的LP。启动单个进程和启动多个进程之间的运行时差异很大:
同样,从同一进程启动多个线程以同时解决多个LP比解决单个LP慢很多。
我怀疑内存访问可能是瓶颈,但是测试一段经常读写内存的代码会导致相似的运行时间:
知道什么可能导致缓慢?
我运行的机器有6个核心和足够的内存,以避免任何交换。 IBM ILOG Cplex库是12.5版。
答案 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
。
最后,另一个重要的考虑是你的问题:你假设你的实施是好的,但没有证据。