Główna zawartość
Podstawy informatyki - program rozszerzony
Kurs: Podstawy informatyki - program rozszerzony > Rozdział 4
Lekcja 4: Obliczenia równoległe i rozproszoneSpróbuj samemu wykonać obliczenia równoległe
Skoro już omówiliśmy teorię obliczeń równoległych, zobaczmy je w akcji. Zazwyczaj, gdy inżynier chce uruchomić program, w którym wykonywane są obliczenia równoległe, używa dedykowanych komputerów o wysokiej wydajności.
Jednak dzięki nowoczesnej technologii internetowej możemy wykonywać obliczenia równoległe również w naszej przeglądarce. Tak jest, możecie obserwować wykonywanie zadań równolegle z zacisza własnego domu lub klasy. Gotowi?
Odwiedź poniższy link, aby wypróbować sparalelizowany program do wykrywania kotów:
Konfigurowanie programu
Celem obliczeń równoległych jest poprawa wydajności. Pomocne jest posiadanie parametrów, które możemy zmieniać i obserwować efekty.
Ten program zawiera dwa parametry:
- Liczba procesów: Aby wykonywać zadania równolegle, program używa technologii przeglądarki zwanej „web workers”. Strona wykrywa, ile twój komputer może uruchomić równolegle na podstawie tego, co zgłasza twój sprzęt i sugeruje użycie takiej ich liczby. Program pozwala również wypróbować mniejszą liczbę procesów, aby można było zobaczyć różnicę szybkości wykonania zadania.
- Liczba obrazów: Ogólnie rzecz biorąc, istnieje większa korzyść z przetwarzania równoległego na większych zestawach danych, więc program domyślnie przetwarza maksymalną liczbę obrazów. Jeśli chcesz, możesz poprosić o przetworzenie mniejszej liczby obrazów i obserwować różnicę w wydajności.
Monitorowanie wykonania
Obserwowanie wykonywania programu równoległego jest jak oglądanie biegu sztafetowego. Ile czasu zajmie program? Który wątek wykona najwięcej pracy najszybciej? To wciaga!
Postępy można obserwować na wykresie na stronie internetowej. Program zaczyna się od krótkiej konfiguracji, sekwencyjnej części inicjalizacji tablicy obrazów i kolejkowania zadań. Następnie zrównoleglone procesy ruszają do wyścigu!
Na wielu komputerach można jednocześnie monitorować aktywność CPU, dzięki czemu można zobaczyć, jak wykorzystywany jest procesor i jak zadanie rozkłada się na rdzenie procesora.
Oto co raportuje mój laptop, gdy program działa z czterema procesami:
Kiedy program rozpoczyna przetwarzanie danych, historia procesora pokazuje, że zużycie wzrasta do 100% na 4 rdzeniach. Monitor aktywności pokazuje, że procesy Chrome wykorzystują ponad 320% CPU (każdy rdzeń ma swoje 100%), a procesy systemowe wykorzystują resztę.
Kiedy po prostu używam laptopa do pisania artykułu, monitor aktywności zazwyczaj informuje, że większość procesora jest niewykorzystana. A ten zrównoleglony program zdecydowanie wykorzystuje do wykonania zadania wszystkie jego zasoby.
O ile szybciej działa ten program?
O ile wydajniejszy jest ten program, gdy jest uruchamiany równolegle? Przekonajmy się o tym, obliczając stosunek czasu potrzebnego do wykonania programu sekwencyjnie, do czasu potrzebnego do wykonania programu w trybie równoległym. Ponieważ mamy możliwość wypróbowania programu z różną liczbą równoległych procesów (tyle, na ile pozwala nasz sprzęt), możemy obliczyć wzrost wydajności przy uruchamianiu coraz większej liczby równolegle wykonywanych procesów.
Najpierw uruchamiamy program z maksymalną liczbą obrazów dla każdej liczby równolegle wykonywanych procesów i za każdym razem zapisujemy czas wykonania programu.
Poniżej cztery przebiegi z mojego laptopa:
Liczba procesów | Czas wykonania (sekundy) |
---|---|
Sekwencyjne uruchamianie programu jest w zasadzie tym samym, co uruchamianie programu z jednym procesem, więc możemy obliczyć wzrost wydajności, dzieląc pierwszy czas wykonania przez wszystkie pozostałe.
Liczba procesów równoległych | Czas wykonania (w sekundach) | Wzrost wydajności |
---|---|---|
Możemy również wykonać wykres, aby zobaczyć na własne oczy, jak zmienia się wydajność wraz ze wzrostem liczby przetwarzanych równolegle procesów:
🔍 Spróbuj to zrobić na komputerze, którego używasz. Jak wypada porównanie wyników? Jeśli są duże różnice, jak myślisz, co jest odpowiedzialne za te różnice?
Czynniki mające wpływ na wydajność
Na moim komputerze wydajność wzrosła 2 razy, ale nie udało się osiągnąć czterokrotnego wzrostu szybkości wykonania, czego naiwnie można było się spodziewać, gdy równolegle wykorzystywałam 4 procesy. Dlaczego?
Istnieje wiele czynników, które mogą wpłynąć na ilość czasu, jaki komputer potrzebuje na wykonanie programu:
Hyperthreading (hiperwątkowość)
Mimo że mój komputer zgłasza, że może uruchomić cztery procesy jednocześnie, odkryłam, że mój procesor ma tylko dwa rdzenie:
Te dwa rdzenie wykorzystują jednak technologię zwaną hiperwątkowością. Firma Intel wymyśliła hyperthreading, aby umożliwić pojedynczemu rdzeniowi procesora jednoczesne wykonywanie dwóch procesów. Ponieważ Intel jest bardzo popularnym producentem procesorów, wiele komputerów osobistych jest już wyposażonych w procesory hiperwątkowe.
Hiperwątkowość sprawdza się, gdy dwa procesy wykonują różne rodzaje obliczeń. Na przykład jedno zadanie może wykonywać operacje arytmetyczne, podczas gdy drugie zadanie przetwarza dane wejściowe. Te dwa zadania wykorzystują różne części procesora i mogą być przyspieszone przez hiperwątkowość. Jeśli jednak dwa zadania wykonują identyczne instrukcje, hiperwątkowość nie może ich przyspieszyć.
Fakt, że mój laptop posiada fizycznie tylko dwa (hiperwątkowane) rdzenie, jest najbardziej prawdopodobnym wyjaśnieniem, dlaczego wzrost wydajności zbliża się do czynnika 2, ale nigdy nie zbliża się do czynnika 4.
🔍 Jeśli widzisz podobne zachowanie na swoim komputerze, zrób małe śledztwo, aby dowiedzieć się, ile fizycznych rdzeni ma procesor.
Inne aktywności CPU
Kiedy ten program jest uruchamiany z przeglądarki internetowej na komputerze, konkuruje o czas procesora z innymi procesami.
Zanim uruchomiłam program na moim laptopie, na procesorze działało już ponad 400 procesów, czyli mieszanka procesów systemowych i aplikacji użytkownika:
To może być mylące, jeśli mówię, że komputer z 2 rdzeniami może uruchomić ponad 400 procesów jednocześnie. W większości przypadków, gdy komputer uruchamia wiele procesów „na raz”, w rzeczywistości szybko przełącza się między nimi, tak szybko, że użytkownik tego nie zauważa. Kiedy komputer uruchamia dwa procesy naprawdę równolegle, wtedy nie musi już przełączać się między nimi.
Program nie może zostać ukończony tak szybko, gdy CPU wykonuje również instrukcje innych procesów, ale trudno jest dokładnie określić, jak bardzo wpływa to na czas trwania programu. Ta niepewność ma wpływ na nasze pomiary wzrostu wydajności przy rozwiązywaniu naszego zadania, ponieważ wpływ innych czynności procesora na program z 4 równoległymi procesami mógł być inny niż w przypadku programu z 1 procesem.
🔍 Aby uzyskać jak najdokładniejsze pomiary, zamknij jak najwięcej innych aplikacji i poczekaj, aż monitor procesora pokaże bardzo niski poziom aktywności. Następnie uruchom jednym kliknięciem ten program i zobacz, co się zmieniło, gdy więcej zasobów procesora komputera zostało uwolnionych do pracy nad programem.
Uaktualnienia interfejsu użytkownika
Strona internetowa, na której działa ten program, zawiera wiele elementów wizualnych: stale aktualizowany wykres, obrazy i wskaźniki ich ładowania, status. Za każdym razem, gdy strona internetowa musi zaktualizować jeden z elementów, procesor wykonuje pracę, aby obliczyć na nowo wartości pikseli i wyrenderować je na ekranie. Ta dodatkowa praca spowalnia czas wykonania.
Jako eksperyment, wyłączyłam aktualizacje interfejsu użytkownika i stwierdziłam, że czas wykonania programu skrócił się z 30 sekund do 22 sekund, co jest znaczącym spadkiem.
🔍 Spróbujcie sami na tej wersji bez aktualizacji UI programu do detekcji obrazów kotów.
Poprawa wydajności
Teraz, gdy dokładnie zbadaliśmy wydajność programu umożliwiającego wykonywanie obliczeń równoległych, lepiej rozumiemy, jak można ją poprawić. Gdybyśmy mieli uruchomić ten program w środowisku produkcyjnym, np. w firmie lub w projekcie badawczym, moglibyśmy wprowadzić następujące zmiany:
- Użyj sprzętu z jak największą liczbą fizycznych rdzeni CPU. Więcej fizycznych rdzeni oznacza więcej zadań, które naprawdę mogą działać równolegle.
- Uruchom program na dedykowanej maszynie, komputerze, na którym nie działają inne procesy użytkownika. Nadal będzie działać kilka procesów systemowych, związane z systemem operacyjnym, ale będzie ich o wiele mniej niż w przypadku typowego domowego komputera.
- Uruchom program z wiersza poleceń, a nie ze strony internetowej. Eliminacja graficznego interfejsu użytkownika usuwa potrzebę jakichkolwiek aktualizacji UI.
🤔 Masz jakieś inne pomysły na ulepszenie tego programu?
🙋🏽🙋🏻♀️🙋🏿♂️Masz pytania związane z tym zagadnieniem? Możesz zadać swoje pytanie poniżej!
Chcesz dołączyć do dyskusji?
Na razie brak głosów w dyskusji