【问题标题】:cplex from MATLAB using parforcplex 从 MATLAB 使用 parfor
【发布时间】:2020-05-22 21:05:22
【问题描述】:

我有一个相当大规模的优化问题,尽管问题本身相当简单。它只是二次+线性目标,具有线性约束。所以这个问题可以用cplexqp解决。问题的规模约为 1300 个变量,但我需要解决大约 200 个独立问题。

如果我只是循环超过 200 次并像往常一样调用 cplexqp,大约需要 16 分钟才能解决所有问题。我考虑使用并行计算,所以我将循环更改为 parfor,现在大约需要 14 分钟。考虑到我们有 12 个内核和 12 个工作线程,我原以为我们会获得更大的加速因子。

我确保并​​行工作器已经初始化(因此 MATLAB 不必花时间初始化它们)。我还验证了任务管理器中的所有 12 个工作线程都处于活动状态,并且它们都在使用大量的 CPU。

我的问题是:您是否认为 cplexqp 具有锁定机制,因为在给定时间(来自不同的线程?)不能调用多个问题(来自不同的线程?)如果我有不同的 MATLAB 进程怎么办? (例如,我可以将输入保存到一个文件中,并启动几个 MATLAB 会话来使用该文件,每个会话都会知道要解决哪个问题索引)。

16 分钟还不错,但我们可能需要每天多次执行此操作(输入可能不同),所以我想知道我们是否可以进一步加快这个过程。

TIA

【问题讨论】:

  • 您的 CPU 利用率如何开始(不使用 parfor)?我猜 cplex 已经使用了多个内核,没有太多改进空间。
  • 这很好。事实证明它一直在使用很多核心(利用率约为 60%)。这是有道理的,因为该算法需要处理画面的许多行并且它们都是“独立”的操作。

标签: matlab cplex parfor


【解决方案1】:

问题在于默认情况下 CPLEX 将使用您机器上的所有个内核来解决一个问题。因此,如果您尝试并行解决多个问题,那么您将严重超额使用 CPU。这可能会导致整体放缓。

因此,您应该仔细选择并行求解的模型数量以及每次求解允许的内核数。如果您使用parfor,那么您应该使用Cplex.Param.threads 参数来限制单个求解的核心数,或者选择单纯形算法来求解您的QP。

整个并行化是否为您带来整体加速取决于您通过限制线程数会观察到各个模型的减速程度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多