在 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" R
和 parameters
自动避免了这个问题)
我在 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" R
和 parameters
自动避免了这个问题)