Szybko, szybciej, jeszcze szybciej Drukuj
Ocena użytkowników: / 0
SłabyŚwietny 
Wpisany przez Patryk yarpo Jar   
sobota, 02 stycznia 2010 18:27

Czasem tak się zdarza, że mój program w języku C nie działa wystarczająco szybko. Właściwie zdarza się tak prawie zawsze ;-) Po tweakowaniu algorytmu i dodaniu opcji -O2/-O3 w kompilatorze dalej jest za wolno. Nie musi to jeszcze oznaczać konieczności zamiany maszyny na mocniejszą lub pisania wstawek asemblerowych. Szczególnie, jeśli NIE potrzebujesz zgodności z normami ISO i zgadzasz się na … pewne błędy.

Tajna broń

Kompilator GCC ma w swoim arsenale opcję -ffast-math. Pozwala ona m.in. na następujące (nielegalne!) optymalizacje:

  • Operacje na odwrotnościach: zezwala na zastąpienie wyrażenia postaci x/y wyrażeniem postaci x*(1/y) – jeśli dzielenie przez y występuje często daje to poważne oszczędności, gdyż mnożenie jest szybsze od dzielenia
  • Nie ustawianie ERRNO w funkcjach matematycznych implementowanych jako pojedyńcza instrukcja
  • Upraszczanie wyrażeń nawet jeśli skutkuje to zmianą “znaku zera” i w ogóle olewanie przez kompilator tego zagadnienia (w formacie IEEE rozróżniamy +0 i -0, na czym niektóre programy polegają)
  • Założenie, że wynik ani żaden z argumentów nie jest NaN lub +/- Inf

W związku z powyższym każde użycie -ffast-math może powodować, że aplikacja będzie dawała mniej dokładne (lub wprost: złe) wyniki, a w skrajnym wypadku się wysypie: z tego powodu rzeczona opcja nie jest domyślnie wywoływana przez -O ani nawet przez -O3.

v2
V2 – tajna broń Niemców. Obraz pochodzi z Wikipedii.
Autorem artykułu jest Maciej Kamiński.