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

3 visualizaciones (últimos 30 días)
Menghui Chen
Menghui Chen el 23 de Sept. de 2021
Editada: Matt J el 27 de Sept. de 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 comentario
Stephen23
Stephen23 el 27 de Sept. de 2021
Because the associative laws of algebra do not generally hold for floating-point numbers.

Iniciar sesión para comentar.

Respuestas (1)

Matt J
Matt J el 23 de Sept. de 2021
Editada: Matt J el 27 de Sept. de 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 comentario
Edric Ellis
Edric Ellis el 27 de Sept. de 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

Iniciar sesión para comentar.

Categorías

Más información sobre Parallel Computing Fundamentals en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by