使用parfor和labSend / labRecieve

时间:2013-11-19 15:30:21

标签: parallel-processing matlab

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

第一个脚本使用内置函数输入获取用户输入,然后使用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

调用方法mpiInit没有帮助......(如上面的代码中所示调用。) 数学作品在文档或其网站上的示例中没有显示此错误或如何处理它。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您通常会在labSend块中使用labRecievelabBarrierspmd等结构,而不是parfor块。

parfor旨在实现令人尴尬的并行算法,换句话说,算法由多个可以并行运行的独立任务组成,并且不需要在任务之间进行通信。

我在这里伸展自己的知识(或许更专家可以纠正我),但据我所知,它没有为工人之间的沟通设置MPI环,这可能是对(相当缺乏信息)的解释你得到的错误信息。

spmd阻止了使用labSendlabRecievelabBarrier的工作人员之间的通信。在文档中有很多使用它们的例子。

答案 1 :(得分:0)

Sam是正确的,parfor期间未启用MPI功能,仅在spmd期间启用。你需要做更多这样的事情:

spmd
  funlist{labindex}(0);
end

(Sam也很正确,你看到的错误消息非常无益)