首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Matlab中用spmd填充阵列

在Matlab中用spmd填充阵列
EN

Stack Overflow用户
提问于 2015-06-10 10:50:56
回答 1查看 143关注 0票数 0

我有一个1乘p阵列R在Matlab (与p大).我初始化这个数组,它的所有条目都等于0,数组R的第一个元素将接收来自myfunction的输出,并应用于parameters(i)。换言之:

代码语言:javascript
复制
R=zeros(p,1);
for i=1:p
R(i)=myfunction(parameters(i));
end

相同的函数myfunction被多次应用于不同的输入。由于p可能会变大,我发现了一个spmd问题(单个程序,多个数据),并认为使用spmd结构可以帮助前面的代码运行得更快。

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

代码语言:javascript
复制
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数组代替?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-10 12:23:03

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

代码语言:javascript
复制
R=zeros(p,1);
parfor i=1:p
    R(i)=myfunction(parameters(i));
end

只有当您需要在迭代之间进行通信时,spmd才会有用。在任何情况下,您都可以在spmd中使用 construct运行这类东西,如下所示:

代码语言:javascript
复制
spmd
    R = codistributed.zeros(p, 1)
    for i = drange(1:p)
        R(i) = myfunction(parameters(i));
    end
end

在这种情况下,您可能也希望parameters也是一个分布式数组,以避免内存中有多个副本。(parfor通过“切片”Rparameters自动避免了这个问题)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30754164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档