Search code examples
matlabparallel-processingparfor

Is it possible to use use `parfor` for parallel computing in Matlab in these codes?


I am using parfor for parallel computing in Matlab. I am not familiar with this command. If that is possible, please look at my code below and tell me if I can write it with parfor. These errors and warnings are appear in Matlab Editor:

  • The parfor loop cannot be run due to the way variable Dat is used. (when I comment line Dat.normXpj = normXpj(pj,:); This error is solved and other errors similar to the following error is appeared.

  • The entire array or structure Bound is broadcast variable. This
    might result in unnecessary communication overhead.

    parfor pj = 1:size(normXpj,1)
    Dat.normXpj = normXpj(pj,:);
    
    if size(Dat.InitialGuess)==0
        X = (Bound(:,1)+(Bound(:,2)-Bound(:,1)).*rand(Nvar,1))';
    else
        X = Dat.InitialGuess;
    end
    
    [Xsqp, ~, FLAG,Options] = mopOPT(X,Dat);
    FEVALS = Options.funcCount;
    
    FES = FES+FEVALS;
    
    PSet(pj,:) = Xsqp;
    PFront(pj,:) = mop(Xsqp,Dat,0);
            if FLAG==-2
        disp('.......... Algo paso...');
    else
      F = PFront(pj,:);
      if Nobj==2
          plot(F(1,1),F(1,2),'*r'); grid on; hold on;
      elseif Nobj==3
    
       end
    end 
    end
    

Solution

  • The problem here is that it we can see that you're not using Dat in a way that is order-dependent, but the static analysis machinery of parfor cannot deduce that because of the way you're assigning into it. I think you can work around this by instead creating a whole new Dat for each iteration of the loop, like so:

    Dat = struct('normXpj', rand(10,1), 'InitialGuess', 3);
    normXpj = rand(10);
    parfor idx = 1:10
        tmpDat = struct('normXpj', normXpj(:,idx), 'InitialGuess', Dat.InitialGuess);
        % use 'tmpDat'
        disp(tmpDat);
    end