indexing within parfor loop

14 visualizzazioni (ultimi 30 giorni)
Adam
Adam il 1 Feb 2018
Risposto: Edric Ellis il 2 Feb 2018
Dear All,
I am having troubles with setting up the following parfor loop.
Basically, I have two variables T and tau and I want to loop over them in parallel.
parfor i = 1:length(tau)*length(T)
k = ceil(i/length(T)); %tau
j = i-(k-1)*length(T); %T
p.T = T(j);
p.tau = tau(k);
fun(p);
end
I get the error message that the problem is with the use of variable p.
Could someone help me how to fix this?
Thank you
  1 Commento
Guillaume
Guillaume il 1 Feb 2018
What is the error message?
I would recommend you use numel instead of length. With numel your code will work whether tau and T are matrices or vectors. With length it will break in interesting ways if any of them are matrices.

Accedi per commentare.

Risposte (2)

Rik
Rik il 1 Feb 2018
Modificato: Rik il 1 Feb 2018
parfor loops don't like temporary variables, because it will not be able to guarantee which assignment will be the last, so it can't tell which version of p to keep available. You can fix this by either creating a double nested loop (which you can make parfor if you like), or indexing p.
parfor i = 1:numel(tau)*numel(T)
k = ceil(i/numel(T)); %tau
j = i-(k-1)*numel(T); %T
p(i).T = T(j);
p(i).tau = tau(k);
fun(p(i));
end
or
for i_tau = 1:numel(tau)
for i_T=1:numel(T)
p.T = T(i_T);
p.tau = tau(i_tau);
fun(p);
end
end

Edric Ellis
Edric Ellis il 2 Feb 2018
The problem here is that parfor can't tell whether you're updating all fields of the variable p, and therefore it thinks there might be order-dependent stuff going on. The simplest way to fix this is to ensure you completely overwrite p on each iteration of your loop, like this:
parfor i = 1:length(tau)*length(T)
k = ceil(i/length(T)); %tau
j = i-(k-1)*length(T); %T
p = struct('T', T(j), 'tau', tau(k));
fun(p);
end

Categorie

Scopri di più su Loops and Conditional Statements in Help Center e File Exchange

Tag

Prodotti

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by