parfor loop output and input are not matched in order
Show older comments
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 Comments
Rik
on 20 Jan 2023
Other than the odd indexing at the end (which should return an error), I don't see what you would be doing wrong here. Can you attach the function?
Edric Ellis
on 23 Jan 2023
Yes, this is definitely not expected. We're going to need reproduction steps that we can execute to be able to help you here. Ideally, it would be good if you could try and come up with a "minimal" reproduction that demonstrates the problem.
Could I also ask: what type of cluster are you running on? If you're running on something other than a "local" pool, it's possible that the workers are seeing a different definition of OFreduced, and that could be causing the problem.
Forrest Han
on 23 Jan 2023
Forrest Han
on 23 Jan 2023
Edric Ellis
on 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
on 23 Jan 2023
Accepted Answer
More Answers (0)
Categories
Find more on Parallel Computing Fundamentals in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!