0

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

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
4

1 回答 1

2

从文档中spmd

spmd语句体返回的值在 MATLAB 客户端上转换为Composite对象。Composite 对象包含对存储在远程 MATLAB 工作程序上的值的引用,并且可以使用元胞数组索引来检索这些值。spmd只要客户端上存在 Composite 并且并行池保持打开状态,worker 上的实际数据仍可用于后续执行。

因此输出是一个包含 4 个元素的复合,因为你有 4 个 CPU 内核,所以output{1}给你第一个元素,output{2}第二个等。只需将它们连接起来,在一个矩阵中得到你的输出。

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

看到您的代码及其三个嵌套循环,我建议现在不要并行化,而是尝试分析您的代码,找出瓶颈所在,并尝试加快这些速度。可能尝试对嵌套循环进行矢量化已经会改进很多。

于 2018-08-27T08:50:35.113 回答