首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对不同的输入变量使用SPMD并按顺序保存输出?

如何对不同的输入变量使用SPMD并按顺序保存输出?
EN

Stack Overflow用户
提问于 2018-08-27 16:13:52
回答 1查看 230关注 0票数 0

我使用模拟退火算法来优化我的问题,我必须对100个不同的输入变量进行优化,并按顺序保存所有变量的输出。问题是我不知道如何在我的代码中实现spmd来进行并行计算,这样每一个输入都运行在一个CPU核心上,最终结果存储在一个有100行的矩阵中。我试着把它放在第一个for循环之前,但它只返回一个由4个元素组成的组合,因为我的CPU有4个核心。以下是我的代码

代码语言:javascript
复制
spmd
for v=1:100
posmat=loading_param(Matrix,v);
nvar=size(posmat,2); 
popsize=50;
maxiter=20;
T0=1000;
Tf=1;
Tdamp=((T0-Tf)/maxiter);
nn=5;
T=T0;

%% initial population
tic
emp.var=[];
emp.fit=inf;
pop=repmat(emp,popsize,1);
    for i=1:popsize
     pop(i).var=randperm(nvar);
     pop_double=pop(i).var;
     posmat_new=tabdil(nvar,pop_double,posmat);
     dis=cij(posmat_new);
     pop(i).fit=fittness(dis);
    end
   [value,index]=min([pop.fit]);
   gpop=pop(index);

%% algorithm main loop 
BEST=zeros(maxiter,1);

for iter=1:maxiter
    for i=1:popsize
        bnpop=emp;
        for j=1:nn

            npop=create_new_pop(pop(j),nvar,posmat);

            if npop.fit<bnpop.fit
                bnpop=npop;

            end

        end

        if bnpop.fit<pop(i).fit
            pop(i)=bnpop;
        else
            E=bnpop.fit-pop(i).fit;
            pr=exp(-E/T);
            if rand<pr
                pop(i)=bnpop;
            end
        end
    end

    T=T-Tdamp;


 [value,index]=min([pop.fit]);
 if value<gpop.fit
 gpop=pop(index);

 BEST(iter)=gpop.fit;
 disp([ 'iter= ' num2str(iter) 'BEST=' num2str(BEST(iter))])
 end
end



%% algorithm results

disp([ ' Best solution=' num2str(gpop.var)])
disp([ ' Best fittness=' num2str(gpop.fit)])
disp([ ' Best time=' num2str(toc)])

bnpop_all(d,:)=bnpop.var;
d=d+1;

end %end of main for loop
end % end of spmd
EN

回答 1

Stack Overflow用户

发布于 2018-08-27 16:50:35

来自spmd上的文档

客户端上,从spmd语句体返回的MATLAB值被转换为Composite对象。复合对象包含对存储在远程MATLAB工作线程上的值的引用,可以使用单元格数组索引检索这些值。只要客户端上存在组合并且并行池保持打开状态,工作进程上的实际数据就会在工作进程上保持可用,以供后续的spmd执行。

因此,输出是一个有4个元素的组合,因为你有4个CPU核心,所以output{1}给你第一个元素,output{2}第二个,依此类推。只需将这些元素连接起来,就可以在一个矩阵中得到输出。

此时,您的代码只运行四次,每个worker一个完整的100次迭代for循环。解决这个问题的一个更简单的方法是使用parfor而不是spmd,因为您可以让您的循环保持不变。如果你想使用spmd,首先把你的v分成四部分(每部分25个元素),然后在每个worker上只迭代这25个元素。

看到你的代码,有三个嵌套的循环,我建议现在不要并行化,而是尝试分析你的代码,找出瓶颈在哪里,并尝试加速这些瓶颈。也许尝试向量化你的嵌套循环将会有很大的改进。

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

https://stackoverflow.com/questions/52035156

复制
相关文章

相似问题

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