- What OS are you using?
- Which release of MATLAB?
- How many physical cores do you have - what's the result of maxNumCompThreads.
Improving performance of parallel code sections
    5 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
Consider the following test code which benchmarks different methods of parallelization within MATLAB:
function partest()
    delete(gcp("nocreate"));
    pool = parpool("threads", 3);
    njob = pool.NumWorkers;
    ndim = 10000000;
    state = rand(ndim, njob);
    dummy = 0;
    % parfor
    tic
    func = zeros(njob, 1);
    parfor ijob = 1 : njob
        func(ijob) = getFunc(state(:, ijob));
    end
    disp("  parfor = " + toc + " seconds.")
    dummy = dummy + sum(func);
    % spmd
    tic
    func = zeros(njob, 1);
    spmd
        indx = spmdIndex;
        func(indx) = getFunc(state(:, indx));
    end
    disp("    spmd = " + toc + " seconds.")
    %dummy = dummy + sum([func{:}]);
    % parfeval
    tic
    clear func
    fout(1 : njob) = parallel.FevalFuture;
    for ijob = 1 : njob
        fout(ijob) = parfeval(pool, @getFunc, 1, state(:, ijob));
    end
    func = fetchOutputs(fout);
    disp("parfeval = " + toc + " seconds.")
    dummy = dummy + sum(func);
    % serial
    tic
    func = zeros(njob, 1);
    for ijob = 1 : njob
        func(ijob) = getFunc(state(:, ijob));
    end
    disp("  serial = " + toc + " seconds.")
    dummy = dummy + sum(func);
    disp(dummy)
    delete(gcp("nocreate"));
end
function func = getFunc(state)
    %func = -sum(state.^2);
    func = 0;
    for idim = 1 : length(state)
        func = func - state(idim)^2;
    end
end
Here is the benchmark output:
  parfor = 0.092802 seconds.
    spmd = 0.044583 seconds.
parfeval = 0.032457 seconds.
  serial = 0.050159 seconds.
Firstly, why is parfeval outperforming all others?
Secondly, are there anything that could be done to any of these parallel constructs to improve their performance against the last (serial) case?
2 Commenti
  Edric Ellis
    
      
 il 1 Feb 2024
				Can I ask
Risposte (1)
  Matt J
      
      
 il 31 Gen 2024
        
      Modificato: Matt J
      
      
 il 31 Gen 2024
  
      The task is too small for parallelization to have any meaningful effect. Similarly, the relative performance numbers for the different methods is not meaningful. You need a task that is at least 30 seconds long serially for any of the comparisons to make any sense.
9 Commenti
  Matt J
      
      
 il 1 Feb 2024
				
      Modificato: Matt J
      
      
 il 1 Feb 2024
  
			What about my earlier comment about having more than 1 loop iteration per worker? It makes intuitive sense to me that parFeval would be optimal when you have only 1 function call per worker. Otherwise, if parfor were optimal for everything, why would they provide parFeval? 
Vedere anche
Categorie
				Scopri di più su Parallel for-Loops (parfor) in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


