Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用parfor实现MATLAB中的cplex_Matlab_Cplex_Parfor - Fatal编程技术网

用parfor实现MATLAB中的cplex

用parfor实现MATLAB中的cplex,matlab,cplex,parfor,Matlab,Cplex,Parfor,我有一个相当大的优化问题,尽管这个问题本身相当简单。这只是二次+线性目标,带有线性约束。所以这个问题可以用cplexqp解决。这个问题的规模大约是1300个变量,但我需要解决大约200个独立的问题 如果我像往常一样循环200次并调用cplexqp,那么解决所有问题大约需要16分钟。我考虑使用并行计算,所以我将循环改为parfor,现在大约需要14分钟。考虑到我们有12个核心和12个工人,我本以为我们会得到更大的加速系数 我确保并行工作程序已经初始化(因此MATLAB不必花费时间初始化它们)。我还

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

如果我像往常一样循环200次并调用cplexqp,那么解决所有问题大约需要16分钟。我考虑使用并行计算,所以我将循环改为parfor,现在大约需要14分钟。考虑到我们有12个核心和12个工人,我本以为我们会得到更大的加速系数

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

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

16分钟还不错,但我们可能需要一天做几次(输入可能不同),所以我想知道我们是否可以进一步加快这个过程


TIA

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

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


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

您的CPU利用率是如何开始的(不使用parfor)?我猜cplex已经使用了多核,没有留下太多的改进空间。这是一个很好的观点。事实证明,它已经使用了很多内核(约60%的利用率)。考虑到该算法需要处理许多行的表,并且它们都是“独立”的操作,这是有意义的。