我在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
数组代替吗?
答案 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
通过“切片”R
和parameters
来自动避免此问题