why the caculation results is different for parfor-loop and for-loop?

2 Ansichten (letzte 30 Tage)
Menghui Chen
Menghui Chen am 23 Sep. 2021
Bearbeitet: Matt J am 27 Sep. 2021
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 Kommentar
Stephen23
Stephen23 am 27 Sep. 2021
Because the associative laws of algebra do not generally hold for floating-point numbers.

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Matt J
Matt J am 23 Sep. 2021
Bearbeitet: Matt J am 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 Kommentar
Edric Ellis
Edric Ellis am 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
ans = -4.5475e-13

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Parallel Computing Fundamentals finden Sie in Help Center und File Exchange

Tags

Produkte


Version

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by