在Matlab中使用spmd填充数组

时间:2015-06-10 10:50:57

标签: matlab parallel-processing distributed

我在Matlab中有一个1-by-p数组R(p大)。我初始化这个数组,其所有条目都等于0,数组R的第i个元素将接收来自myfunction的输出,应用于parameters(i)。换句话说:

R=zeros(p,1);
for i=1:p
R(i)=myfunction(parameters(i));
end

使用不同的输入多次应用相同的函数myfunction。因为p可能变大,我认识到spmd问题(单个程序,多个数据),并认为使用spmd构造将有助于以前的代码运行得更快。

如果我运行matlabpool,我会获得n_workers不同的实验室。我的想法是将数组R分成n_workers不同的部分,并要求每个可用的工作者填充数组的一部分。我想做这样的事情:

q=((p-1)-mod(p-1,n_workers-1))/(n_workers-1);

lab 1:
for j=1:q
R(j) = myfunction(parameters(j));
end

lab 2:
for j=(q+1):(2*q+1)
R(j) = myfunction(parameters(j));
end

...

lab n_workers:
for j=( q*(n_workers-1)+1 ):p
R(j) = myfunction(parameters(j));
end

但是,由于我是并行编程的新手,我不知道如何在Matlab中正确编写。我可以使用coditributed数组代替吗?

而不是将自己细分为数组R.

1 个答案:

答案 0 :(得分:0)

首先,如果您的功能评估是独立的,那么最好使用parfor,如下所示:

R=zeros(p,1);
parfor i=1:p
    R(i)=myfunction(parameters(i));
end

spmd通常仅在您需要迭代之间的通信时才有用。在任何情况下,可以spmd内使用for-drange construct运行此类内容,如下所示:

spmd
    R = codistributed.zeros(p, 1)
    for i = drange(1:p)
        R(i) = myfunction(parameters(i));
    end
end

在这种情况下,你可能也想让parameters成为分布式数组,以避免在内存中有多个副本。 (parfor通过“切片”Rparameters来自动避免此问题