UWAGA! Używamy plików cookies, by ułatwić korzystanie z naszego serwisu. Jeśli nie chcesz, by pliki cookies były zapisywane na Twoim dysku zmień ustawienia swojej przeglądarki. Co to są pliki cookies?

Mathematica
Obliczenia równoległe

Przykłady bardziej zaawansowane. Przybliżenie liczby Pi.

Przybliżenie wartości liczby Pi można uzyskać generując stochastycznie punkty wewnątrz kwadratu o boku równym 1, sprawdzając jednocześnie, ile z nich znajduje się wewnątrz koła o promieniu 1/2. Z poniższego równania wyliczona zostanie przybliżona wartość liczby Pi.



Wystarczy zatem wygenerować równomiernie rozłożony zestaw punktów wewnątrz kwadratu, policzyć ile z nich leży wewnątrz koła i ich iloraz pomnożeć przez 4. Otrzymana wartość będzie przybliżeniem liczby Pi, tym lepszym im więcej punktów zostanie wygenerowanych.

Na początek wygenerowanych zostanie 5000 punktów.



Selekcja punktów leżących wewnątrz koła.



Wykres wygenerowanych punktów. Punkty wewnątrz koła zastaną zaznaczone kolorem czerwonym.





Przybliżona wartość liczby Pi będzie wynosić:



Nie jest to zbyt rewelacyjny wynik, więc wygenerowanych zostanie 100000 punktów i dokonany zostanie pomiar czasu obliczeń.



Liczbę punktów można dalej zwiekszać co niewątpliwie będzie porawiać dokładność przybliżenia liczby Pi.

Jak to będzie jednak wyglądać w wersji równoległej?

Sprawdzenie listy dostępnych Kerneli obliczeniowych:



Z listy wynika, że dostępnych jest 12 jąder obliczeniowych. Wybierzmy do obliczeń tylko cztery z nich. Zmienna kernelNazwy zawiera listę wybranych jąder obliczeniowych. Polecenie DistributeDefinitions[...] powoduje zdefiniowanie zmiennej r na wszystkich kernelach obliczeniowych.



W kolejnych dyrektywach następuje równoległe generowanie punktów losowych w liczbie 25000 na każdym jądrze obliczeniowym, sprawdzenie długości list punktów losowych dla każdego procesu, selekcja punktów wewnątrz koła i wyświetlanie liczby punktów wewnątrz koła dla każdego procesu.



Na listach wyjściowych widoczny jest fakt, że obliczenia zostały uruchomione tylko na 4 z dostępnych 12 Kerneli obliczeniowych.

Poniższa dyrektywa pozwala graficznie zaprezentować punkty wygenerowane przez każdy proces obliczeniowy.





Sumowanie wyników z poszczególnych procesów obliczeniowych i obliczanie przybliżenia liczby Pi.


Przy nieco zoptymalizowanej procedurze obliczeniowej i obliczeniach na wszystkich 12 procesorach symulacja zostanie wykonana dla 10 milionów punktów. Pominięto funkcję Select[...] dla stwierdzenia czy punkt leży wewnątrz okręgu. Zastosowano selekcję na bazie funkcji Round[...] wykorzystując fakt, że dla punktów na zewnątrz koła:
Round[-(x^2+y^2)-r^2=-1
gdy
r=1/2



Zmienna partitions zawiera listę składającą się z liczb punktów jakie będą wygenerowane przez każdy proces równoległy, aby łącznie wygenerować 10 000 000 punktów.



Przybliżona wartość liczby Pi wynosi 3.14115. Obliczenia dla 10 milionów punktów przez 12 równoległych procesów były wykonywane przez ok.2.06 sekundy. W poprzednim przykładzie, bez równoległych obliczeń czas symulacji dla 5 tysięcy punktów wyniósł 1.41 sekundy. Przyspieszenie obliczeń związane z równoległą pracą 12 Kerneli jest bardzo znaczące.