ಠ_ಠ (・へ・) ( ͡° ͜ʖ ͡°) (ʘ‿ʘ) (⌐■‿■) ƪ(⁰o⁰;)ʃ (╯°□°)╯︵ ┻━┻ ლ(ಠಠ ლ)

  •  

    Znalazłem wczoraj błąd w swoim kodzie, który spowalniał go około 1000-krotnie.

    Jakiś czas temu napisałem parę symulacji związanych z Ogólną Teorią Względności w #cpp, a wśród nich prostą symulację opóźnienia Shapiro. Gdy zainteresowałem się #rustlang, postanowiłem spróbować przepisać ten kod właśnie w Ruście. Spodziewałem się uzyskać ładniejszy kod o porównywalnej wydajności, jednak kiedy w końcu napisałem działającą wersję symulacji Shapiro, okazała się kilkadziesiąt razy wolniejsza od wersji w C++. Próbowałem optymalizować kod, ale ni cholery nie potrafiłem się zbliżyć do wydajności wersji C++, więc w końcu się poddałem. To było jakieś 2 lata temu.

    Wczoraj, zainspirowany pojawieniem się zdjęcia czarnej dziury, postanowiłem wrócić do tematu. Zaobserwowałem jedną interesującą rzecz, która umknęła mi te 2 lata temu. Otóż symulator Shapiro, żeby uzyskać wynik, symuluje tor fotonu w pobliżu Słońca, rozwiązując pewne równanie różniczkowe krok po kroku metodą Dormanda-Prince'a. To, co zauważyłem, to że symulacja w C++ wykonuje około 2000 kroków, a w Ruście - ponad 2 miliony.

    Zacząłem szukać źródła rozbieżności. Wynik symulacji był dobry w obu wersjach, więc algorytm musiał być w miarę poprawny. W końcu znalazłem powód.

    Metoda Dormanda-Prince'a ma jedną fajną opcję - dość łatwo w niej oszacować błąd względem ścisłego rozwiązania i na tej podstawie dopasowywać wielkość kroku wykonywanego przez metodę. Okazało się, że w kodzie w Ruście... wpisałem o jedno 0 za dużo we fragmencie szacującym błąd ( ಠ_ಠ) Efekt był taki, że błąd wychodził ogromny, metoda wybierała więc najmniejszy możliwy krok symulacji, żeby go minimalizować, przez co wykonywała dużo więcej kroków, niż powinna. Oto zmiana, która poprawiła błąd.

    Po tej poprawce kod w Ruście wykonuje wreszcie tyle samo kroków, co kod w C++, z tymi samymi wynikami. Okazuje się jednak... 6 razy szybszy niż kod w C++. Prawdopodobnie duża część tej przewagi wynika z tego, że kod w Ruście próbowałem optymalizować, kiedy sądziłem, że jest wolny, a kod w C++ jest taki jak był zawsze, ale jednak wynik mnie pozytywnie zaskoczył.

    Dla zainteresowanych:
    - wersja w Ruście
    - wersja w C++

    #programowanie i trochę #fizyka #symulacje
    pokaż całość

...to tylko najnowsze aktywności użytkownika irecky

Zobacz wszystkie dodane znaleziska, komentarze i wpisy korzystając z menu powyżej.