Poniższa treść może dotyczyć błędów obliczeniowych w procesorach graficznych.
Biorąc pod uwagę wystarczająco dużo czasu, Intel i7-3610QM i Nvidia GeForce GTX 660 nie będą się ze sobą zgadzać, biorąc pod uwagę te same instrukcje. (cuda 5.5, compute_20, sm_20)
Pozostaje zatem stwierdzić, że jeden z nich popełnia błąd.
Podczas testu porównawczego studium wykonalności symulacji cząstek zauważyłem, że po tysiącu transformacji o podwójnej precyzji (transformacje, w tym sin, cos, mnożenie, dzielenie, dodawanie i odejmowanie) zaczęły pojawiać się błędy.
Dam ci mały fragment liczb do porównania (pierwszy numer to zawsze procesor, drugi procesor graficzny)
-1.4906010142701069
-1.4906010142701074
-161011564.55005690
-161011564.55005693
-0.13829959396003652
-0.13829959396003658
-16925804.720949132
-16925804.720949136
-36.506235247679221
-36.506235247679228
-3.3870884719850887
-3.3870884719850896
(zauważ, że nie każda sekwencja transformacji powoduje błąd)
Chociaż maksymalny błąd jest prawie nieistotny (0.0000000000000401%)
, nadal istnieje i przyczynia się do błędu skumulowanego.
Teraz ten błąd może wynikać z różnicy w implementacji jednej z wewnętrznych bibliotek. Rzeczywiście wygląda na to, że GPU woli zaokrąglać w dół lub obcinać tam, gdzie procesor zaokrągla w górę. Co ciekawe, wydaje się, że dzieje się tak tylko w przypadku liczb ujemnych.
Chodzi o to, że identyczne instrukcje niekoniecznie gwarantują identyczne wyniki, nawet na urządzeniach cyfrowych.
Mam nadzieję, że to się przyczyniło.
EDYCJA jako sidenote: W przypadku błędów arytmetycznych GPU, to (ctrl + f „Pierwszy GPU z obsługą pamięci ECC”) może również być interesujące, choć niekoniecznie związane z powyższymi błędami.