why the caculation results is different for parfor-loop and for-loop?
2 views (last 30 days)
Show older comments
load('matlab.mat')
for i =1:1
b_OLS(i) = X_*y;
end
parfor i =1:1
b_OLS_(i) = X_*y;
end
error = b_OLS_-b_OLS
The results is:
error =
1.8190e-11
why the caculation results is different for parfor-loop and for-loop?
1 Comment
Stephen23
on 27 Sep 2021
Because the associative laws of algebra do not generally hold for floating-point numbers.
Answers (1)
Matt J
on 23 Sep 2021
Edited: Matt J
on 27 Sep 2021
Probably because, with a parpool active, the matrix multiplication code cannot multithread the operation in precisely the same way. The vectors are split into parallel blocks of one size if a parpool is open and another size if not.
1 Comment
Edric Ellis
on 27 Sep 2021
In particular, by default for process-based parpool, the workers run in single-computational-thread mode. This can definitely result in slightly different results compared to multithreaded mode. You can use maxNumCompThreads(1) to put the client in single-computational-thread mode to check. Like this:
A = rand(1,10000);
B = rand(10000,1);
maxNumCompThreads(4);
c1 = A*B;
maxNumCompThreads(1);
c2 = A*B;
c1-c2
See Also
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!