我已经得到了一些代码,当它循环遍历循环时,每次要处理的内容会增加一些百分比。前几次迭代需要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。
答案 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