在 Matlab 中用 spmd 填充数组

Fill an array with spmd in Matlab

我在 Matlab 中有一个 1×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 吗?

首先,如果你的函数求值是独立的,你最好使用 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 通过 "slicing" Rparameters 自动避免了这个问题)