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

2 vues (au cours des 30 derniers jours)
Menghui Chen
Menghui Chen le 23 Sep 2021
Modifié(e) : Matt J le 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 commentaire
Stephen23
Stephen23 le 27 Sep 2021
Because the associative laws of algebra do not generally hold for floating-point numbers.

Connectez-vous pour commenter.

Réponses (1)

Matt J
Matt J le 23 Sep 2021
Modifié(e) : Matt J le 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 commentaire
Edric Ellis
Edric Ellis le 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

Connectez-vous pour commenter.

Catégories

En savoir plus sur Parallel Computing Fundamentals dans Help Center et File Exchange

Tags

Produits


Version

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by