Parallel processing 使用parfor和labSend/labRecieve
我想为一个项目并行运行两个matlab脚本,并在它们之间进行通信。这样做的目的是让一个脚本进行图像分析,并将结果发送给另一个脚本,后者将使用它进行更多计算(耗时,但与在图像中查找内容的任务无关)。由于这两项任务都很耗时,最好是实时完成,我认为并行化是必要的。 为了了解应该如何实现这一点,我创建了一个测试脚本,以了解如何在这两个脚本之间进行通信 第一个脚本使用内置函数input获取用户输入,然后使用labSend将其发送给另一个脚本,后者接收并打印它Parallel processing 使用parfor和labSend/labRecieve,parallel-processing,matlab,Parallel Processing,Matlab,我想为一个项目并行运行两个matlab脚本,并在它们之间进行通信。这样做的目的是让一个脚本进行图像分析,并将结果发送给另一个脚本,后者将使用它进行更多计算(耗时,但与在图像中查找内容的任务无关)。由于这两项任务都很耗时,最好是实时完成,我认为并行化是必要的。 为了了解应该如何实现这一点,我创建了一个测试脚本,以了解如何在这两个脚本之间进行通信 第一个脚本使用内置函数input获取用户输入,然后使用labSend将其发送给另一个脚本,后者接收并打印它 function [blarg] = inpu
function [blarg] = inputStuff(blarg)
mpiInit(); %added because of error message, but do not work...
for i=1:2
labBarrier; % added because of error message
inp = input('Enter a number to write');
labSend(inp);
if (inp == 0)
break;
else
i = 1;
end
end
end
function [ blarg ] = testWrite( blarg )
mpiInit(); % added because of error message, but does not help
par = 0;
if ( blarg == 0)
par = 1;
end
for i = 1:10
if (par == 1)
labBarrier
delta = labReceive();
i = 1;
else
delta = input('Enter number to write');
end
if (delta == 0)
break;
end
s = strcat('This lab no', num2str(labindex), '. Delta is = ')
delta
end
end
%%This is the file test_parfor.m
funlist = {@inputStuff, @testWrite};
matlabpool(2);
mpiInit(); % added because of error message, but does not help
parfor i=1:2
funlist{i}(0);
end
matlabpool close;
然后,当代码运行时,出现以下错误消息:
Starting matlabpool using the 'local' profile ... connected to 2 labs.
Error using parallel_function (line 589)
The MPI implementation has not yet been loaded. Please
call mpiInit.
Error stack:
testWrite.m at 11
Error in test_parfor (line 8)
parfor i=1:2
调用方法mpinit
没有帮助。。。(如上面的代码所示调用。)
在mathworks文档或其网站上的示例中,没有任何地方显示此错误或如何处理此错误
感谢您的帮助 您通常会在
spmd
块中使用诸如labSend
、labRecieve
和labBarrier
之类的构造,而不是parfor
块
parfor
旨在实现令人尴尬的并行算法,也就是说,由多个可并行运行的独立任务组成的算法,不需要任务之间的通信
我在这里扩展了我的知识(也许有更专业的人可以纠正我),但据我所知,它并没有为工作人员之间的通信建立MPI环,这可能是您收到的错误消息(相当缺乏信息)的原因
spmd
块允许工人之间使用labSend
、labRecieve
和labBarrier
进行通信。文档中有很多使用它们的示例。Sam正确地指出,MPI功能在parfor
期间未启用,仅在spmd
期间启用。您需要做更多类似的事情:
spmd
funlist{labindex}(0);
end
(Sam也说得很对,您看到的错误消息毫无帮助)好的,谢谢您的回复!但是当我将代码aboc改为:
funlist={@inputStuff,@testWrite};如果matlabpool('size')>0 matlabpool close end matlabpool(2);numlabs spmd(2)y=funlist{labindex}(0);结束matlabpool关闭代码>Matlab然后说:使用“本地”配置文件启动matlabpool。。。连接到2个实验室。ans=1
然后冻结。然后我检查了numlabs,如代码所示,它返回1。有什么想法吗?删除了最后一条评论,因为它是在我检查numlabs之前…似乎是输入出于某种原因导致了死锁。如果使用I而不是输入法:inp=ceil(rand(1)*10)代码>然后它就工作了!请注意,spmd
块内的numlabs
仅大于1
。