Il seguente contenuto potrebbe riguardare errori di calcolo nelle GPU.
Dato il tempo sufficiente, Intel i7-3610QM e una Nvidia GeForce GTX 660 non saranno d'accordo tra loro dato le stesse istruzioni. (cuda 5.5, compute_20, sm_20)
Quindi, uno rimane per concludere che uno dei due commette un errore.
Durante un benchmark di studio di fattibilità sulla simulazione delle particelle, ho notato che dopo circa mille trasformazioni di precisione doppia (trasformazioni tra cui sin, cos, moltiplicazione, divisione, addizione e sottrazione) iniziarono a insinuarsi.
Ti darò un piccolo estratto di numeri da confrontare (il primo numero è sempre CPU, la seconda GPU)
-1.4906010142701069
-1.4906010142701074
-161011564.55005690
-161011564.55005693
-0.13829959396003652
-0.13829959396003658
-16925804.720949132
-16925804.720949136
-36.506235247679221
-36.506235247679228
-3.3870884719850887
-3.3870884719850896
(nota che non tutte le sequenze di trasformazione generano un errore)
Mentre l'errore massimo è quasi trascurabile (0.0000000000000401%)
, esiste ancora e contribuisce all'errore cumulativo.
Ora questo errore potrebbe essere dovuto a una differenza nell'implementazione di una delle librerie intrinseche. In effetti, sembra che la GPU preferisca arrotondare o troncare dove la CPU arrotonda. Curiosamente, questo sembra accadere solo su numeri negativi.
Ma il punto è che istruzioni identiche non sono necessariamente garantite per restituire risultati identici, anche su macchine digitali.
Spero che questo abbia contribuito.
EDIT come sidenote: nel caso di errori aritmetici della GPU, anche questo (ctrl + f "Prima GPU con supporto memoria ECC") potrebbe essere interessante, anche se non necessariamente rilevante per gli errori sopra.