Как использовать SPMD для разных входных переменных и сохранить выходные данные по порядку? - PullRequest
0 голосов
/ 27 августа 2018

Я использую алгоритм имитации отжига для оптимизации своей задачи, я должен сделать это для 100 различных входных переменных и сохранить выходные данные для всех переменных по порядку.проблема в том, что я не знаю, как реализовать spmd в моем коде для параллельных вычислений, чтобы каждый вход работал на одном ядре ЦП, а окончательные результаты сохранялись в матрице из 100 строк.Я пытался поставить его перед первым циклом for, но он возвращает только составную часть, состоящую из 4 элементов, поскольку мой процессор имеет 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

1 Ответ

0 голосов
/ 27 августа 2018

Из документации по spmd:

Значения, возвращаемые из тела оператора spmd, преобразуются в Составные объекты наКлиент MATLAB.Составной объект содержит ссылки на значения, хранящиеся на удаленных работниках MATLAB, и эти значения можно получить с помощью индексации массива ячеек.Фактические данные о работниках остаются доступными о работниках для последующего выполнения spmd, пока на клиенте существует составной, а параллельный пул остается открытым.

Таким образом, выход является составным с4 элемента, так как у вас 4 ядра ЦП, поэтому output{1} дает вам первый элемент, output{2} второй и т. Д. Просто объедините их, чтобы получить выходные данные в одной матрице.

Ваш код на данный моментпросто выполняется четыре раза, по одной полной 100 итерации for цикла на одного работника.Более простой способ решить эту проблему - использовать parfor вместо spmd, так как вы можете оставить цикл таким же.Если вы хотите использовать spmd, сначала нарежьте v на четыре части (по 25 элементов в каждой), затем на каждом работнике выполняйте итерации только по этим 25 элементам.

Просмотр кода с тремя вложенными элементамиЦиклы, я предлагаю не распараллеливать сейчас, а вместо этого попытаться профилировать ваш код, выяснить, где узкие места, и попытаться ускорить их.Вероятно, попытка векторизации ваших вложенных циклов уже значительно улучшится.

...