Wpis z mikrobloga

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
  • 39
@thewickerman88: Fajny ;) Coraz więcej firm go stosuje, sam pracuję dla jednej z nich (MaidSafe). Z takich bardziej znanych to wiem, że stosują go Mozilla (duh), Dropbox, Yelp... W Polsce wiem o jednej firmie, Anixe. Tu jest trochę więcej na ten temat: https://www.rust-lang.org/production

A fajny głównie dlatego, że jak w C czy C++ masz dużą kontrolę na bardzo niskim poziomie, brak GC itp., a jednocześnie nie da się w nim tak
@fizyk20: kod C++ na pewno dałoby się jeszcze podrasować ;) wygląda trochę jak stary C++(raw pointery, tablice z C). np. przekazywanie vector4 przez wartość, a nie referencję, co może dawać w kość przy kopiowaniu :P

co do Rusza, to się nie wypowiadam. ale ciągle słyszę, że pisanie w Ruście to jak pisanie w nowoczesnym C++, więc może po unowocześnieniu tego C++ by się go dogoniło ;)
@passage: Spróbuję ;)

Idea opóźnienia Shapiro jest taka, że promień światła przelatujący w pobliżu dużej masy (np. Słońca) jest nieco opóźniony przez grawitacyjną dylatację czasu względem promienia, który leciałby przez pustą przestrzeń.

Ten symulator symuluje przebieg promienia, który leci od Ziemi do Wenus i z powrotem (tak faktycznie mierzono to opóźnienie), przelatując przy samej powierzchni Słońca. A robi to symulując dwa osobne fotony - oba startują z powierzchni Słońca, jeden jest
kod C++ na pewno dałoby się jeszcze podrasować ;) wygląda trochę jak stary C++(raw pointery, tablice z C). np. przekazywanie vector4 przez wartość, a nie referencję, co może dawać w kość przy kopiowaniu :P


@MamCieNaHita: A to na pewno. Ja nigdy nie wyszedłem poza C++98 czy tam 03, więc to jest jak najbardziej stary C++. Podejrzewam, że dałoby się sporo go ulepszyć - podobnie zresztą pewnie kod w Ruście, który niby
Idąc za sugestią znajomego, założyłem mirkolistę do wołania do swoich wpisów. Prawdopodobnie jeszcze dzisiaj wrzucę coś więcej o opóźnieniu Shapiro i moim symulatorze, więc jak ktoś jest zainteresowany, zapraszam do zapisywania się :) https://mirkolisty.pvu.pl/list/JXDgIlmSxdw5cy8A

Wołam plusujących komentarz @passage o robieniu znalezisk: @inquis1t0r @aso824 @Shamson @takbardzotymczasowekonto @Phosphoester @Elmono @filip_k @Suchockey @Guru103
@Waldemar_Morawiec: Z tymi liczbami jest ten problem, że są trochę magiczne - to po prostu współczynniki pochodzące z metody Dormanda-Prince'a. Ciężko wymyślić dla nich nazwę sensowniejszą niż COEFF_ERROR_1, a taka nazwa niewiele by pomogła w zauważeniu nadmiarowego zera...