我正在使用单线程 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。
最佳答案
如果启用了多个线程,CPLEX 将使用并发优化器。这意味着它在一个线程中运行对偶单纯形算法,并在其余其他线程中运行屏障算法。 CPLEX 报告最先完成的算法的答案。因此,如果您有 6 个核心,那么它可能会使用 1 个线程用于双单工,使用 5 个线程用于屏障。当你尝试同时解决 3 个 LP 时,它们会互相窃取周期。您可以通过将参数 RootAlg 设置为 2 来仅使用对偶单纯形(始终仅使用 1 个线程)。您还可以设置参数 AuxRootThreads限制每个 LP 求解所使用的线程数。 您应该检查哪种算法(原始算法、双重算法或屏障算法)更适合您的问题。如果可以利用多线程的 Barrier 效果最好,那么您最好串行运行每个模型并让 CPLEX 进行并行化。
关于java - 并发 CPLEX 进程比单个进程慢很多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17058912/