>我有一个相当大的优化问题,尽管问题本身相当简单。它只是二次+线性物镜,具有线性约束。所以这个问题可以用 cplexqp 解决。问题的规模约为 1300 个变量,但我需要解决 ~200 个独立问题。
如果我只是循环 200 多次并像往常一样调用 cplexqp,解决所有问题大约需要 16 分钟。我考虑使用并行计算,所以我将循环更改为parfor,现在大约需要14分钟。考虑到我们有 12 个内核和 12 个工人,我本以为我们会得到更大的加速系数。
我确保并行工作线程已经初始化(因此 MATLAB 不必花时间初始化它们(。我还验证了所有 12 个工作线程在任务管理器中都处于活动状态,并且它们每个线程都使用了大量的 CPU。
我的问题是:你认为 cplexqp 有锁定机制吗,因为它不能在给定时间(来自不同线程(调用多个问题?如果我有不同的 MATLAB 流程怎么办?(例如,我可以将输入保存到文件中,并启动多个 MATLAB 会话来使用该文件,每个会话都会知道要解决的问题索引(。
16 分钟还不错,但我们可能需要每天多次执行此操作(可能有不同的输入(,所以我想知道我们是否可以进一步加快这个过程。
蒂亚
问题是,默认情况下,CPLEX 将使用计算机上的所有内核来解决一个问题。因此,如果您尝试并行解决多个问题,那么您将严重超额订阅 CPU。这可能会导致整体放缓。
因此,您应该仔细选择并行求解的模型数量以及每个求解允许的内核数。如果使用parfor
则应使用 Cplex.Param.threads 参数来限制单个求解的内核数,或者选择单纯形算法来求解 QP。
整个并行化是否为您提供了整体加速,取决于您通过限制线程计数来观察到各个模型的减速程度。