2015-06-25 29 views
9

W poprzednim semestrze musieliśmy opracować raytracera na kurs w szkole. Szkoła była skończona, próbowałem trochę z nią pogodzić.Pływak Java raytrace vs double

Chciałem zobaczyć, co się zmieni, jeśli zmienię wszystkie obliczenia zmiennoprzecinkowe z podwójnego na zmiennoprzecinkowe (wszystkie obliczenia są wykonywane z podwójnymi). Zmieniłem więc każdą zmienną, by wpisać float, i po prostu wyrzuciłem każdy podwójny wynik z metod matematycznych. Testowanie mojego raytracera na kilku scenach wykazało całkiem przyzwoity wzrost wydajności.

Wyszukiwanie w Internecie Znalazłem różne powody, dla których float może być szybszy, ale także niektóre twierdzą, że podwójne może być równie szybkie lub nawet szybsze w środowisku 64-bitowym. Chodzi o to, że pracuję w środowisku 64-bitowym i JVM. Jaki byłby powód tej zwiększonej wydajności?

Teraz czytam książkę PBRT i planuję przepisać raytracera od nowa. Czy wybranie pływającego dla wszystkich obliczeń zmiennoprzecinkowych stwarza jakiekolwiek problemy? Nie zauważyłem żadnego podczas moich testów, ale być może w przypadku niektórych scen mniejsza precyzja mogłaby (testowanie skrzyżowań wydaje się być sytuacją, w której może to stanowić potencjalny problem)? A może kompromis, jak np. Użycie podwójnego testu krytycznego i float dla mniej krytycznych obliczeń? Musiałbym użyć innej biblioteki Math, aby pozbyć się rzucania, czy będę pływał po wodzie.

+0

Wierzę, że 'podwójne d = 1d' to dwie instrukcje, podczas gdy' float f = 1f' jest jedna. Nawet na 64-bitowych komputerach. Bałagan z 64-bitową maszyną JVM. – jn1kk

+0

"Używam środowiska 64-bitowego" 64-bitowy system operacyjny nie jest traktowany jako środowisko 64-bitowe. Twój kompilator i inne narzędzia (takie jak JVM, jeśli robisz Javę) również muszą być 64-bitowe. –

+1

możliwy duplikat [Czy liczba woltów jest mniejsza niż dwukrotnie? Czy program 64-bitowy działa szybciej niż program 32-bitowy?] (Http://stackoverflow.com/questions/5738448/is-float-slower-than-double-does-64-bit-program-run-faster-than-32 -bit-program) –

Odpowiedz

6

Jest prawie żadnej różnicy pomiędzy pływakiem i dwukrotnie, jeśli chodzi o szybkość obliczania miarę procesorów desktopowych są platformy. Różnica może wynikać jedynie ze zwiększonych wymagań dotyczących przepustowości pamięci, ponieważ liczba podwójna wymaga dwa razy więcej miejsca.

W przypadku obliczeń wykonywanych przez procesory graficzne różne są te dostosowane do float i np. GPU firmy Nvidia ulega znacznemu rozpadowi pod względem podwójności.

Podejdę z mieszanym podejściem; przechowuj dane, takie jak wielokąty z precyzją zmiennoprzecinkową, ale wykonuj wszystkie obliczenia dwukrotnie. Mały ślad pamięci, wysoka precyzja - wygrana-wygrana.

+0

Dzięki za odpowiedź! Wygląda to na dobry kompromis, coś, czego spróbuję. – Koekje