2016-01-21 138 views
0

我想在matlab中建立一个递归树结构。由于它是一个非常大的树,我正在尝试构建,所以我想尽可能加快计算速度,这就是为什么我想尝试并行计算。递归树结构的并行计算

的什么我试图做可能看起来像这样的一个例子:

function result = minimalExample(x) 
    n = numel(x); 
    if n == 0 
     result = 0; 
     return; 
    end 
    if n==1 
     result = x; 
     return 
    end 
    average = mean(x); 
    result = minimalExample(x(x<average))+minimalExample(x(x>average)); 
    if any(x==average) 
     result = result*average; 
    end 
end 

我试图用parfeval做这样的计算:

function result = minimalExampleParallel(x,pool) 
    n = numel(x); 
    if n == 0 
     result = 0; 
     return; 
    end 
    if n==1 
     result = x; 
     return 
    end 
    average = mean(x); 
    f(1) = parfeval(pool,@minimalExampleParallel,1,x(x<average),pool); 
    f(2) = parfeval(pool,@minimalExampleParallel,1,x(x>average),pool); 
    result = 0; 
    for i = 1:2 
     [~,value] = fetchNext(f); 
     result = result + value; 
    end 
    if any(x==average) 
     result = result*average; 
    end 
end 

但我得到一个Workers cannot execute parfeval or parfevalOnAll. -error 。

我当时希望能有办法将工作添加到工作人员可能接触到的全球工作队列中,但我一直无法做到。

这是以任何方式可能吗?如果是的话如何?如果不是这样,为什么?

回答

0

我知道你很早以前就问过这个问题,但我有一个答案。我也在寻找这样的解决方案,但找不到任何东西。虽然没有真正在网上发布,所以我希望这是在这里,以防其他人想知道如何。

您可以执行一种全局作业调度程序。声明一个parcluster,然后使用createCommunicatingJob在所述集群上创建单独的作业。然后,这很重要,请将每个作业的NumWorkersRange属性设置为小于工作人员总数,最好将其平均分配,尽管您可以根据需要进行分配。 (例如:如果您有12名工人和4份工作,请将每个工人范围设置为[1 3])。如果你不这样做,那么它将排队其他任务,只执行第一个任务,因为它会将所有工人分配给第一个任务。

这适用于包含parfeval语句的函数,其语法类似于parfeval。我使用MATLAB的paralleldemo_blackjack_parfeval函数进行了验证。我希望这是你正在寻找的。我知道这就是我正在寻找的!

链接:http://www.mathworks.com/help/distcomp/createcommunicatingjob.html