2016-04-21 14 views
7

Mam następujące code do nauki.Typy danych Aparapi

Moja funkcja obliczania daje nieoczekiwane wyniki, gdy działa na aparapi.

Czy jest jakiś problem z moim kodem lub aparapi?

Wyniki są;

Result  Num   Expected 
2026982348 406816880 40681688012 
2026982516 406816881 40681688180 
2026982594 406816882 40681688258 
2026982662 406816883 40681688326 
2026982830 406816884 40681688494 
2026982898 406816885 40681688562 
2026982966 406816886 40681688630 
2026983044 406816887 40681688708 
2026983212 406816888 40681688876 
2026983280 406816889 40681688944 
2026983338 406816890 40681689002 
2026983506 406816891 40681689170 
2026983584 406816892 40681689248 
2026983652 406816893 40681689316 
2026983820 406816894 40681689484 
2026983888 406816895 40681689552 
2026983956 406816896 40681689620 
2026984134 406816897 40681689798 
2026984202 406816898 40681689866 
2026984270 406816899 40681689934 

Edit: Jeżeli ustawić executionMode JTP lub CPU, mam prawdziwe wyniki (wynik == spodziewać), ale na trybie GPU nie jest problemem. Używam pod koniec 2013 roku macbook pro siatkówki z Windows 10.

Edycja2: Powrót do mojej metody kalkulacji powoduje problem. Jeśli wrócę Long.MAX_VALUE, to działa. Ale (long) tc * 100 (lub ((long) tc) * 100) nie daje (np. 40681688900)

+1

Dlaczego downvoting? Oczywiście jest problem ... – Hyperion

Odpowiedz

2

myślę należy przejrzeć kod sprawdzania przed Aparapi Java Kernel Guidelines, expecially zwracając uwagę na innych ograniczeń i Strzeż skutków ubocznych sekcje.

Pamiętaj, aby zachować prostszy kod.

Szukając kodu, w metodzie calculate można w szerokim zakresie korzystać z operatora modulus (%). Proponuję zalogować wszystkie obliczenia, aby móc porównać to, co otrzymujesz w trybie JTP i co otrzymujesz w trybie GPU, aby dowiedzieć się, czy są jakieś problemy z tym operatorem.

EDIT: W swojej metodzie oblicz użyć zmiennych int do przechowywania wartości, które mogą posiadać numery do 2^31-1, czyli 2147483647 znana jako Integer.MAX_VALUE. Jeśli wykonasz int value=2147483647; value++; otrzymasz jako wynik -2147483648 tak zwany Integer.MIN_VALUE.

Można alternatywnie wypróbować program z niższymi numerami początkowymi lub zmienić deklaracje zmiennych na długie, które mogą zawierać Long.MAX_VALUE, a mianowicie 2^63-1.

Zarówno długa, jak i wewnętrzna wartość są obsługiwane przez Aparapi.

+0

Jeśli uruchomisz kod w trybie JTP lub CPU, zobaczysz, że otrzymuję właściwy wynik. Z drugiej strony mam problem z mnożeniem. Na przykład. Mam numer 406816889 i otrzymam 4068168894, jeśli wykonam num * 10 + 4, ale num * 100 + 44 nie da 40681688944 w trybie GPU. Może jest przepełnienie? – Hyperion

+0

Do edycji, moje liczby maksymalnie 9 cyfr, więc nie powinno być problemu. Ale moje wyniki to 11 cyfr i trzymam je długo:/ – Hyperion

+0

Czy próbowałeś debugować kod przez oglądanie dzienników lub zmiennych? – abarisone

1

Witam Jestem głównym opiekunem nowego nowego Aparapi.com i nowego repozytorium github. Jesteśmy znacznie bardziej aktywni w nowym projekcie domu, a nawet mamy już kilkanaście wydawnictw w centrach maven. Możesz rozważyć przejście do nowego Aparapi.

Powiedziawszy to, jestem programistą w nowym Aparapi i przeprowadziłem test i potwierdziłem, że jest to uzasadniony błąd Aparapiego. Sprawdzę, co jest przyczyną błędu i mam nadzieję, że uda się naprawić błąd przed następnym wydaniem. issue has been reported here, jeśli chcesz go śledzić. Zapamiętaj to dla nowego projektu Aparapi, więc poprawka błędu prawdopodobnie nie pojawi się w starszym projekcie Aparapi.

+0

Thx dużo! Publikuję coś na ten temat. – Hyperion

Powiązane problemy