Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prędkość funkcji pow(), a wielokrotne mnożenie

Ostatnio zmodyfikowano 2017-07-23 02:37
Autor Wiadomość
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
P-163494
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.
P-163495
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.
P-163496
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ę.
P-163497
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ć.
P-163506
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 ;)
P-163507
jankowalski25
» 2017-07-23 02:37:52
Poza tym, jeśli użyjesz
using type = double;
, to na wspomnianej stronie zobaczysz instrukcje SSE, co powinno dodatkowo przyspieszyć obliczenia (w przykładzie pod dywanem (strona 607, jeśli link nie działa) (dlaczego tam, a nie w tym temacie?) są tylko instrukcje FPU).
P-163510
« 1 »
  Strona 1 z 1