parfor loop output and input are not matched in order

2 vues (au cours des 30 derniers jours)
Forrest Han
Forrest Han le 20 Jan 2023
Commenté : Rik le 23 Jan 2023
I have a code segment here:
so I wish to use parfor to calculate a function called OFreduced. The OFreduced takes in 10 numbers each time as input.
I have stored all input variables in modified_geo as a matrix of 3*10, where each entire row is one input to the function. So in total I have 3 sets of input that are needed to be calculated in parfor.
The output from the function OFreduced is simply just a number, and I stored that in another array v, which should contain the 3 results from the input.
It should produce three different answers and stored in v, and I could perfectly run this in serial with no problem. However parfor gives me the same number for the three inputs (i.e. three numbers are indentical in v). It seems like I have not matched the input index to the output index, and the results are "overwriting".
Please advise how shall I modify this to "match" the outputs and the inputs in the correct order. Many thanks in advance!
% compute cost using simplified OF
modified_cost1 = zeros(3,1);
v = zeros(3,1);
% run OF with temporary variable
parfor j = 1:3
v(j) = OFreduced(modified_geo(j,:));
end
modified_cost1 = v(1,1:3);
  6 commentaires
Edric Ellis
Edric Ellis le 23 Jan 2023
By reproduction steps - I mean code that we can execute and see the problem. It sounds like that's not going to be easily possible if you're calling an external executable.
When you execute "avl.exe" - how are you getting the results out? If it creates a file - then that's a potential problem right there. Your workers might well all be clashing trying to write the same file - unless you take steps to prevent that. One simple way to avoid that is to have the workers change to a unique directory prior to running the body of the loop, like this:
parfor j = 1:3
oldWd = pwd();
newDirName = tempname();
mkdir(newDirName);
cd(newDirName);
... do stuff
cd(oldWd);
end
Forrest Han
Forrest Han le 23 Jan 2023
@Edric Ellis This segment works! Thank you very much :)

Connectez-vous pour commenter.

Réponse acceptée

Rik
Rik le 23 Jan 2023
I suspect the source of the problem is the interaction with the file system.
You should consider generating a random file name (either with randi indexing from allowed characters, or with tempname). That way you ensure you don't overwrite the file that the other process is using.
I would suggest avoiding cd if at all possible. You can use tempdir if you need the temp folder location.
  2 commentaires
Forrest Han
Forrest Han le 23 Jan 2023
This works, thank you very much!
Rik
Rik le 23 Jan 2023
You're very much welcome.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Startup and Shutdown dans Help Center et File Exchange

Produits


Version

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by