java - 并发 CPLEX 进程比单个进程慢很多

标签 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 秒

知道是什么原因导致速度缓慢吗?

我运行的机器有 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/

相关文章:

java - 中断来自不同类的java线程

linux - 使用HDMI端口作为网络协议(protocol)接口(interface)?

java - 将数字四舍五入到小数点后第一位

java - 如何在 map 上显示地点可能性?

c++ - 使用 memory_order_relaxed 进行存储,使用 memory_order_acquire 进行加载

c++ - boost 正交状态的状态图并行执行

java - 使用多线程在数组中查找质数

java - SCS Kafka消费者仅处理最新消息

java - PriorityQueue添加元素会改变元素,奇怪的bug

c - 为什么我的 Berkeley DB 并发数据存储应用程序挂起?