Parallel processing 使用parfor和labSend/labRecieve

Parallel processing 使用parfor和labSend/labRecieve,parallel-processing,matlab,Parallel Processing,Matlab,我想为一个项目并行运行两个matlab脚本,并在它们之间进行通信。这样做的目的是让一个脚本进行图像分析,并将结果发送给另一个脚本,后者将使用它进行更多计算(耗时,但与在图像中查找内容的任务无关)。由于这两项任务都很耗时,最好是实时完成,我认为并行化是必要的。 为了了解应该如何实现这一点,我创建了一个测试脚本,以了解如何在这两个脚本之间进行通信 第一个脚本使用内置函数input获取用户输入,然后使用labSend将其发送给另一个脚本,后者接收并打印它 function [blarg] = inpu

我想为一个项目并行运行两个matlab脚本,并在它们之间进行通信。这样做的目的是让一个脚本进行图像分析,并将结果发送给另一个脚本,后者将使用它进行更多计算(耗时,但与在图像中查找内容的任务无关)。由于这两项任务都很耗时,最好是实时完成,我认为并行化是必要的。 为了了解应该如何实现这一点,我创建了一个测试脚本,以了解如何在这两个脚本之间进行通信

第一个脚本使用内置函数input获取用户输入,然后使用labSend将其发送给另一个脚本,后者接收并打印它

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