Why do the results of the same MATLAB operation differ for different CPUs?

26 visualizzazioni (ultimi 30 giorni)
I am running the same MATLAB code on two machines with the same operating system and bitness (or on the same machine using different numbers of computational threads), but I get different results. Why does this happen?

Risposta accettata

MathWorks Support Team
MathWorks Support Team il 5 Dic 2022
Small differences (within the effects of round-off) are expected for (1) different processors, or (2) even on the same processor when changing the number of computational threads. This is a direct consequence of performance optimizations specific to different processors and multi-threading.
For example, the matrix multiplication below may produce a relative error of 1.5481e-16 on a certain machine when switching between 1 and 4 computational threads:
>> rng(0,'twister');
>> A = rand(4e4, 31);
>> maxNumCompThreads(1);
>> R1 = A'*A;
>> maxNumCompThreads(4);
>> R2 = A'*A;
>> relError = norm(R1-R2)./norm(R1)
relError =
   1.5481e-16
Similar differences are expected when switching between different processors.
Which functions suffer from this issue?
As mentioned above, slight differences in floating point arithmetic are the result of differences between computer hardware. These differences are not specific to any particular functions.
Is there any way to avoid this issue?
In general, you can get the same results for the same code by using the same hardware and configuration.
Another possibility is to use the Symbolic Math Toolbox for MATLAB, which supports exact symbolic computations and variable-precision arithmetic, both of which should give you reproducible results on different machines and when using different numbers of computational threads. Please note that symbolic and variable-precision computations will generally be slower than using regular floating point values (e.g. double).
e.g.
>> rng(0,'twister');
>> A = vpa(rand(4e4,31));
>> maxNumCompThreads(1);
>> R1 = A'*A;
>> maxNumCompThreads(4);
>> R2 = A'*A;
>> relError = norm(R1-R2)./norm(R1)
 
relError =
 
0.0

Più risposte (0)

Categorie

Scopri di più su Introduction to Installation and Licensing in Help Center e File Exchange

Prodotti


Release

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by