Kinexity Temat założony przez niniejszego użytkownika |
Prędkość funkcji pow(), a wielokrotne mnożenie » 2017-07-22 21:30:27 Witam wszystkich! Mam takie pytanie - dla potęg o małym wykładniku (np. 2 lub 3) czasowo wydajniejsze jest mnożenie "ręcznie", czy mimo wszytko użycie funkcji pow()? Chodzi mi głównie o typ long double . EDIT: O małym wykładniku całkowitym - uzupełnienie specjalnie dla @Gibas11 |
|
Gibas11 |
» 2017-07-22 21:44:38 Zależy od implementacji i ficzerów procesora, pewnie std::pow. Poza tym nie jest sporo małych potęg, których nie da się policzyć wielokrotnym mnożeniem, choćby 1/2. |
|
jankowalski25 |
» 2017-07-22 22:25:12 Czy wszystkie wartości są całkowite? Jeśli tak, to można wszystkie działania wykonywać na typach całkowitoliczbowych. W przypadku dwójki najlepiej nadają się do tego przesunięcia bitowe, natomiast przy trójce pewnie trzeba to policzyć ręcznie.
Czy wyniki mogą być obliczone w czasie kompilacji? Jeśli tak, to można użyć na przykład szablonów i policzyć wszystko przed uruchomieniem programu.
Pamiętaj również o tym, że jeśli zdecydujesz się na typy zmiennoprzecinkowe, to musisz liczyć się z niedokładnością obliczeń.
Oprócz tego dobrze byłoby wiedzieć, czy rzeczywiście tutaj potrzebujesz jakichś optymalizacji. Nie próbuj na siłę szukać czegoś szybszego, dopóki nie masz konkretnego kodu, który działa za wolno. |
|
Kinexity Temat założony przez niniejszego użytkownika |
» 2017-07-22 22:33:17 Mam konkretny kod. Piszę od 5 mies. program obliczający ruchy obiektów wzajemnie oddziaływających grawitacyjnie. Większość zmiennych jest typu long double po to by zwiększyć dokładność (wiem, że są przypadki odwrotne dla typów zmiennoprzecinkowych, ale mogę je pominąć). Staram się to zoptymalizowaćjak tylko się da, jednocześnie pilnując dokładności. Więc tak - mam po co szukać sposobów na optymalizację. |
|
Elaine |
» 2017-07-23 00:03:30 Prawie zawsze szybsze będzie mnożenie, ale dlaczego nie sprawdzić, co robi kompilator? Jak wynika z https://godbolt.org/g/yHncgQ, dla wykładnika 2 nie ma różnicy, bo kompilator i tak rozwija to do jednego mnożenia, dla innych wykładników te operacje dają różne wyniki i dlatego kompilator rozwija wywołania std::pow do mnożeń tylko, jeśli podano -ffast-math. Większość zmiennych jest typu long double |
Staram się to zoptymalizowaćjak tylko się da |
Ładowanie i zapis 80-bitowego long double z i do pamięci jest na x86 od 4 do 10 razy wolniejsze, w zależności od mikroarchitektury procesora i od tego, czy interesuje nas przepustowość, czy opóźnienie, niż ładowanie lub zapis double, w dodatku operacji na takim long double nie da się zwektoryzować. |
|
pekfos |
» 2017-07-23 00:12:33 Jeśli chodzi tylko o podniesienie do kwadratu to podejrzewam, że najlepiej policzyć to samemu. Zobacz w kodzie wynikowym, czy pow() dostaje jakieś sensowne optymalizacje, jeśli wykładnik jest stały.
Chyba miałem za długo otwartą kartę zanim odpowiedziałem ;) |
|
jankowalski25 |
» 2017-07-23 02:37:52 |
|
« 1 » |