Matlab - 批处理作业不会离开排队状态

时间:2016-03-05 01:00:54

标签: matlab parallel-processing

我已经得到了一些代码,当它循环遍历循环时,每次要处理的内容会增加一些百分比。前几次迭代需要4秒,但到了第100次,他们需要花费几分钟 - 这是一个精简的参数选择,因为我打算做350次迭代。用这个进行认真的研究需要花费大量的时间,并且简单地运行脚本将Matlab的手绑在背后直到它完成所有操作真是不方便,而且最重要的是它几乎没有曾经一次使用多个核心。

据我所知,启用并行池将启用并行处理。即使我无法将任何for循环转换为parfor循环,我也知道将脚本作为batch作业运行会将该过程发送到后台,我可以使用Matlab界面和其他7个处理器做其他事情,等待这个完成。

但是,尽管我已经启动并运行了本地并行池,并且我已经检查了启动批处理作业的语法,但是它没有离开"排队"状态。我第一次输入batch('Script4')并点击Enter,然后意识到我必须有一个变量名称,所以我做了run1 = batch('Script4')。我键入了get(run1,'State'),并检查了作业监视器,并且都告诉我它的状态是排队等等#34。

在我来到这里之前,我做了一些谷歌搜索,虽然我发现了一些Q&类似的经历,但它们似乎是通过等待池在启动时停止使用整个CPU的事情来解决的。但是很久以前我开始使用池了(此时它仍在运行!),当我输入第一个batch命令时,我的第一个线索是错误的是Windows任务管理器说所有8核心为0%。

在开始执行排队作业之前,我需要调用或调整一些内容吗?

我在Windows 7 Enterprise上使用Matlab R2015a。

1 个答案:

答案 0 :(得分:1)

我认为这里的问题是您在并行池打开时尝试运行batch个作业。 (不幸的是,这是一种常见的误解)。基本上,并行池和您的batch工作都试图消耗本地工作者。但是,由于您首先打开了并行池,因此它占用了所有本地工作者,并且batch作业无法继续。提交batch作业时,您应该看到警告,如下所示:

>> parpool('local');
Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers.
>> j = batch(@rand, 1, {});
Warning: This job will remain queued until the Parallel Pool is closed. 

有两种可能的解决方法 - 第一种是简单的

delete(gcp('nocreate'))

将确保没有打开并行池,并且您的batch提交应继续进行。如果您的任务相对较短,则第二种方法更合适 - 您可以使用parfeval将工作提交到开放的并行池:

f = parfeval(@rand, 1); % initiate 'rand' on the parallel pool workers
fetchOutputs(f); % wait for completion, and retrieve the result