parfor loop output and input are not matched in order

4 visualizaciones (últimos 30 días)
Forrest Han
Forrest Han el 20 de En. de 2023
Comentada: Rik el 23 de En. de 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 comentarios
Edric Ellis
Edric Ellis el 23 de En. de 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 el 23 de En. de 2023
@Edric Ellis This segment works! Thank you very much :)

Iniciar sesión para comentar.

Respuesta aceptada

Rik
Rik el 23 de En. de 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 comentarios
Forrest Han
Forrest Han el 23 de En. de 2023
This works, thank you very much!
Rik
Rik el 23 de En. de 2023
You're very much welcome.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Productos


Versión

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by