递归树结构的并行计算

时间:2016-01-21 09:58:33

标签: matlab parallel-processing

我正在尝试在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. - 错误。

我希望有一种方法可以将工作添加到工作人员可能会达到的全球工作队列中,但我还没有能够这样做。

这有可能吗?如果是这样怎么样?如果不是这样,为什么呢?

1 个答案:

答案 0 :(得分:0)

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

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

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

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