我有一个1乘p阵列R在Matlab (与p大).我初始化这个数组,它的所有条目都等于0,数组R的第一个元素将接收来自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中正确地编写它。与其细分数组R,不如用coditributed数组代替?
发布于 2015-06-10 12:23:03
首先,如果您的功能评估是独立的,那么最好使用parfor,如下所示:
R=zeros(p,1);
parfor i=1:p
R(i)=myfunction(parameters(i));
end只有当您需要在迭代之间进行通信时,spmd才会有用。在任何情况下,您都可以在spmd中使用 construct运行这类东西,如下所示:
spmd
R = codistributed.zeros(p, 1)
for i = drange(1:p)
R(i) = myfunction(parameters(i));
end
end在这种情况下,您可能也希望parameters也是一个分布式数组,以避免内存中有多个副本。(parfor通过“切片”R和parameters自动避免了这个问题)
https://stackoverflow.com/questions/30754164
复制相似问题