parfor loop output and input are not matched in order

조회 수: 2 (최근 30일)
Forrest Han
Forrest Han 2023년 1월 20일
댓글: Rik 2023년 1월 23일
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
Edric Ellis
Edric Ellis 2023년 1월 23일
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 2023년 1월 23일
@Edric Ellis This segment works! Thank you very much :)

댓글을 달려면 로그인하십시오.

채택된 답변

Rik
Rik 2023년 1월 23일
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
Forrest Han
Forrest Han 2023년 1월 23일
This works, thank you very much!
Rik
Rik 2023년 1월 23일
You're very much welcome.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Startup and Shutdown에 대해 자세히 알아보기

제품


릴리스

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by