Multithreading Michał Drobot. Plan wykładu Multi-threadingMulti-threading Metody synchronizacjiMetody synchronizacji Lock-lessLock-less Operacje niskopoziomowe,

Slides:



Advertisements
Podobne prezentacje
Język C/C++ Funkcje.
Advertisements

Podstawowe pojęcia programowania współbieżnego
Programowanie wielowątkowe
Mechanizmy pracy równoległej
Jarosław Kuchta Semafory.
Jarosław Kuchta Monitory.
Dzisiejszy wykład Wyjątki.
Język ANSI C Funkcje Wykład: Programowanie komputerów
Programowanie I Rekurencja.
SYSTEMY OPERACYJNE WSTĘP
Języki programowania C++
Autor Roman Jędras Prowadzący: dr inż. Antoni Izworski Przedmiot:
Nguyen Hung Son Uniwersytet Warszawski
Wykład 5 Przerwania w systemie SAB80C537 dr inż. Andrzej Przybył
Wykład nr 7: Synchronizacja procesów
Systemy operacyjne Wykład nr 5: Wątki Piotr Bilski.
Systemy operacyjne Wykład nr 4: Procesy Piotr Bilski.
Wykład nr 2: Struktura systemu komputerowego a system operacyjny
Systemy operacyjne.
Temat nr 10: System przerwań
Instytut Fizyki Teoretycznej
Język Java Wielowątkowość.
Semafory według normy POSIX
Wieloprocesowy system operacyjny dla komputerów ATARI XL/XE
Semafory.
Pamięć wspólna Opis własnego rozwiązania Marcin Kamiński, Michał Kotra Wydział EAIiE Katedra Automatyki Kraków, 2008.
Zastosowanie technologii CUDA w sztucznej inteligencji
Klasy w C++. Deklaracja klasy class NazwaTwojejKlasy { //w tym miejscu piszemy definicje typów, //zmienne i funkcje jakie mają należeć do klasy. }; //tutaj.
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Podstawy programowania II
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Podstawy programowania
Systemy operacyjne.
Zasada działania komputera
Budowa systemu komputerowego
Automatyka i Robotyka Systemy czasu rzeczywistego Wykład 4.
Architektura aplikacji wielowątkowych Jakub Binkowski.
Architektura komputerów
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Problem sekcji krytycznej
Przerwanie ang. interrupt.
Maszyna wirtualna ang. virtual machine, VM.
Buforowanie D e f i n i c j a.
M i k r o j ą d r o D e f i n i c j a. M i k r o j ą d r o to rodzaj jądra systemu operacyjnego, które zawiera tylko najbardziej niezbędne elementy, takie.
POŚREDNIK Jak reprezentowana jest informacja w komputerze? liczby – komputer został wymyślony jako zaawansowane urządzenie służące do wykonywania.
Architektura PC.
Wykład 7 Synchronizacja procesów i wątków
W ą t e k (lekki proces) thread.
Kurs języka C++ – wykład 9 ( )
Programowanie strukturalne i obiektowe C++
Skalowanie aplikacji JPA na przykładzie Oracle TopLink Grid
Procesor – charakterystyka elementów systemu. Parametry procesora.
Derekursywacja i optymalizacja kodu
Procesor, pamięć, przerwania, WE/WY, …
Procesy, wątki Program a proces Proces: Przestrzeń adresowa, kod, dane, stos (część pamięci do przechowania zmiennych lokalnych i niektórych adresów) Otwarte.
POZNAŃ SUPERCOMPUTING AND NETWORKING CENTER 1 Zastosowanie LDAP w usługach WWW i Portali PCSS, 2002.
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Programowanie wielowątkowe w Javie Wykład 9 mgr inż. Michał Misiak.
Paweł Starzyk Obiektowe metody projektowania systemów
Optymalna konfiguracja Microsoft SQL Server 2014
Struktura systemu operacyjnego
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Analiza porównawcza procesorów Inlet
Tryby adresowania i formaty rozkazów mikroprocesora
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
Programowanie I Rekurencja.
Wątki, programowanie współbieżne
Programowanie Obiektowe – Wykład 2
Podział mikroprocesorów
Tworzenie wątków w Javie
Zapis prezentacji:

Multithreading Michał Drobot

Plan wykładu Multi-threadingMulti-threading Metody synchronizacjiMetody synchronizacji Lock-lessLock-less Operacje niskopoziomowe, atomoweOperacje niskopoziomowe, atomowe Metody optymalizacji gier pod MTMetody optymalizacji gier pod MT

Metody synchronizacji WielowątkowośćWielowątkowość Umożliwia zwiększenie funkcjonalności, wydajności poprzez równoległe wykonywanie wielu pracUmożliwia zwiększenie funkcjonalności, wydajności poprzez równoległe wykonywanie wielu prac Przyszłość programowania użytkowegoPrzyszłość programowania użytkowego Standard aplikacji wysokowydajnychStandard aplikacji wysokowydajnych GryGry X360, PS3X360, PS3 Stanowi wyzwanie architektoniczne jak i sprzętoweStanowi wyzwanie architektoniczne jak i sprzętowe

Metody synchronizacji WielowątkowośćWielowątkowość Skalowalność architekturSkalowalność architektur 2, 4, 8,.. 64 rdzenie2, 4, 8,.. 64 rdzenie GPU : potoki : 8, 16 … 1200GPU : potoki : 8, 16 … 1200 Wymaga odmiennego podejścia do wielu problemów algorytmicznych, przechowywania jak i transferu danychWymaga odmiennego podejścia do wielu problemów algorytmicznych, przechowywania jak i transferu danych

Metody synchronizacji WielowątkowośćWielowątkowość Powoduje problemyPowoduje problemy SynchronizacjiSynchronizacji Współdzielenia zasobówWspółdzielenia zasobów ZakleszczeńZakleszczeń Problemy dostępuProblemy dostępu ArchitekturyArchitektury Zły kod wielowątkowy wykonuje się dłużej niż jednowątkowyZły kod wielowątkowy wykonuje się dłużej niż jednowątkowy

Metody synchronizacji WielowątkowośćWielowątkowość Powoduje problemyPowoduje problemy SynchronizacjiSynchronizacji Współdzielenia zasobówWspółdzielenia zasobów ZakleszczeńZakleszczeń Problemy dostępuProblemy dostępu ArchitekturyArchitektury Zły kod wielowątkowy wykonuje się dłużej niż jednowątkowyZły kod wielowątkowy wykonuje się dłużej niż jednowątkowy

Metody synchronizacji using System; using System.Threading; class ThreadTest, static void Main() { Thread t = new Thread(new ThreadStart(Go)); t.Start(); Go(); } static void Go() { for (char c='a'; c <= 'z'; c++) Console.Write(c); }

Metody synchronizacji using System using System.Threading; class ThreadTest { static void Main() { Thread t = new Thread(new ThreadStart(Go)); t.Start(); Go(); } static void Go() { for (char c= a ; c <= z ; c++) Console.Write(c); } } Output: Abcdabcdefghijklmnoprsefg hjiklmnopqrstuvwxyztuvwxyz

Metody synchronizacji LockLock Lock(this)Lock(this) Zakłada sprzętowe wstrzymanie na aktualne działanie wątkuZakłada sprzętowe wstrzymanie na aktualne działanie wątku Inne wątki oczekują na zakończenie sekcji krtycznejInne wątki oczekują na zakończenie sekcji krtycznej Wykonuje się na warstwie CLR – sprzętowejWykonuje się na warstwie CLR – sprzętowej szybkiszybki

Metody synchronizacji MonitorMonitor Monitor.Pulse(this)Monitor.Pulse(this) Nakazuje obudzenie innych wątków będących w stanie oczekiwaniaNakazuje obudzenie innych wątków będących w stanie oczekiwania Monitor.Wait(this)Monitor.Wait(this) Nakazuje wątkowi przejście w stan oczekiwania aż do otrzymania PulseNakazuje wątkowi przejście w stan oczekiwania aż do otrzymania Pulse Uważać na permanentne uśpienie samego siebie -> deadlockUważać na permanentne uśpienie samego siebie -> deadlock Korzysta z usług powiadamiania OSKorzysta z usług powiadamiania OS Stosunkowo szybkiStosunkowo szybki

Metody synchronizacji PollingPolling Impatient WaitImpatient Wait Odpytywanie globalnej chronionej wartościOdpytywanie globalnej chronionej wartości

Metody synchronizacji MutexMutex Mutex.WaitOne()Mutex.WaitOne() Oczekuje zwolnienia jednego zasoby z puli mutexówOczekuje zwolnienia jednego zasoby z puli mutexów Mutex.WaitAll()Mutex.WaitAll() Oczekuje zwolnienia wszystkich zasobów z puliOczekuje zwolnienia wszystkich zasobów z puli Mutex.WaitAny()Mutex.WaitAny() Oczekuje zwolnienia co najmniej jednego zasobu z puliOczekuje zwolnienia co najmniej jednego zasobu z puli

Metody synchronizacji SemaphoreSemaphore Semaphore(initialCount,maxCount)Semaphore(initialCount,maxCount) Umożliwia kontrole do zasobu pod względem ilości przyznanych dostępówUmożliwia kontrole do zasobu pod względem ilości przyznanych dostępów Semaphore.WaitOne()Semaphore.WaitOne() Sempahore.Release()Sempahore.Release() … Globalny, może być zmieniony przez każdegoGlobalny, może być zmieniony przez każdego

Metody synchronizacji PorównaniePorównanie MutexMutex 20x wolniejszy od locka20x wolniejszy od locka Wykonywany na poziomie OSWykonywany na poziomie OS Polecany do synchronizacji pomiędzy procesamiPolecany do synchronizacji pomiędzy procesami Mutex / Monitor należą do wątku i tylko on może dokonać ich zmianyMutex / Monitor należą do wątku i tylko on może dokonać ich zmiany Smaphore jest globalnySmaphore jest globalny Monitor/Sempahore jako typy powiadamianie mogą korzystać z timeOutu (podając czy zostały wybudzone / uśpione przez upływ czasu, czy sygnał zewnętrzny)Monitor/Sempahore jako typy powiadamianie mogą korzystać z timeOutu (podając czy zostały wybudzone / uśpione przez upływ czasu, czy sygnał zewnętrzny)

Lock-less Programowanie bez użycia blokowań jakiejkolwiek postaciProgramowanie bez użycia blokowań jakiejkolwiek postaci De facto używa ochrony zmiennych ale na poziomie atomowym i na bardzo krótki okres czasuDe facto używa ochrony zmiennych ale na poziomie atomowym i na bardzo krótki okres czasu Najwydajniejsza metoda programowania wielowątkowegoNajwydajniejsza metoda programowania wielowątkowego Trudna w debuguTrudna w debugu Trudna w produkcjiTrudna w produkcji

Lock-less InterlockedInterlocked Interlocked.Increment(ref counter)Interlocked.Increment(ref counter) Atomowa inkrementacjaAtomowa inkrementacja Interlocked.Decrement(ref counter)Interlocked.Decrement(ref counter) Interlocked.Exchange(ref val1, new_val)Interlocked.Exchange(ref val1, new_val) Atomowa wymiana na poziomie rejestrów, zwraca wartość val1, podmienia val1 na new_valAtomowa wymiana na poziomie rejestrów, zwraca wartość val1, podmienia val1 na new_val Interlocked.CompareExchange(ref a, b,c)Interlocked.CompareExchange(ref a, b,c)

Lock-less int lockCounter = 0; // inkrementuj licznik i wykonaj kod jeśli // wartosc poprzednia wynosiła 0 if (Interlocked.Inerement(ref lockCounter) == 1) { } // dekrementuj licznik Interlocked.Decrement(ref lockCounter);

Lock-less Out-of-order executionOut-of-order execution Trybie MT wiele procesorów może dokonywać optymalizacji zarządzania pamięcią niskopoziomową w wyniku czego może dojśc do przestawienia kolejności wykonywania operacji (bądź nawet całych zadań w zależności od optymalizacji odczytu, zapisu i wykorzystania L2)Trybie MT wiele procesorów może dokonywać optymalizacji zarządzania pamięcią niskopoziomową w wyniku czego może dojśc do przestawienia kolejności wykonywania operacji (bądź nawet całych zadań w zależności od optymalizacji odczytu, zapisu i wykorzystania L2) Może dojśc do sytuacji, w której kod wykona się prawidłowo jednak w kolejności nie przewidzianej przez programistęMoże dojśc do sytuacji, w której kod wykona się prawidłowo jednak w kolejności nie przewidzianej przez programistę W MT może to mieć duże znaczenie dla synchronizacjiW MT może to mieć duże znaczenie dla synchronizacji

Lock-less MemoryBarrier()MemoryBarrier() Użyteczne w systemach o słabym zarządzaniu pamięciąUżyteczne w systemach o słabym zarządzaniu pamięcią Bądź dobrych o nieprzewidywalnej naturzeBądź dobrych o nieprzewidywalnej naturze Powoduje zapewnienie, że żadna instrukcja w kodzie znajdująca się PRZED MemoryBarrier() nie zostanie ustawiona w kolejności do wykonania ZA MemoryBarrier()Powoduje zapewnienie, że żadna instrukcja w kodzie znajdująca się PRZED MemoryBarrier() nie zostanie ustawiona w kolejności do wykonania ZA MemoryBarrier()

Optymalizacja gier Gry w swej wielozadaniowej naturze stosunkowo łatwo podlegają podstawowemu podziałowi na działania równoległeGry w swej wielozadaniowej naturze stosunkowo łatwo podlegają podstawowemu podziałowi na działania równoległe Problem pojawia się przy próbie optymalizacji na więcej niż 2 wątkiProblem pojawia się przy próbie optymalizacji na więcej niż 2 wątki

Optymalizacja gier Thread 1 Thread 2 Thread 3 Thread 4 Thread 5

Optymalizacja gier Main Thread Physics Animation/Skinning Particle Systems Networking File I/O Game Thread

Optymalizacja gier Wysokie opóźnienia synchronizacjiWysokie opóźnienia synchronizacji Niewykorzystanie możliwości sprzętuNiewykorzystanie możliwości sprzętu Nieprzystosowany kodNieprzystosowany kod

Optymalizacja gier Double-BufferingDouble-Buffering Podwójne buforowaniePodwójne buforowanie Standardowa metoda synchronizacji komunikacji międzywątkowejStandardowa metoda synchronizacji komunikacji międzywątkowej

Optymalizacja gier Double-BufferingDouble-Buffering Buffer 1 Buffer 2 Update Thread Render Thread

Optymalizacja gier Double-BufferingDouble-Buffering Buffer 1 Buffer 2 Update Thread Render Thread

Optymalizacja gier Double-BufferingDouble-Buffering Update Thread Render Thread

Optymalizacja gier Double-BufferingDouble-Buffering Render buffer nie wymaga aktualizacji całościowejRender buffer nie wymaga aktualizacji całościowej Jedynie część zmieniających się danychJedynie część zmieniających się danych Koszt aktualizacji całego bufora co klatke za wysokiKoszt aktualizacji całego bufora co klatke za wysoki Zmiany w miejscu (zabranie wartości, przepisanie, powrót = koszt)Zmiany w miejscu (zabranie wartości, przepisanie, powrót = koszt)

Optymalizacja gier Double-BufferingDouble-Buffering Update Render Game Data Scene Data

Optymalizacja gier Double-BufferingDouble-Buffering Każdy wątek posiada swój własny zestaw zunifikowanych danych (kopia na wybranych polach)Każdy wątek posiada swój własny zestaw zunifikowanych danych (kopia na wybranych polach) RenderRender XYZ, RotationXYZ, Rotation GameGame XYZ, Rotation, Logic, PhysicsXYZ, Rotation, Logic, Physics Transfer dokonuje się jedynie na wartościach zmianTransfer dokonuje się jedynie na wartościach zmian

Optymalizacja gier Double-BufferingDouble-Buffering Mały bufor wymianMały bufor wymian Szybka synchornizacjaSzybka synchornizacja Oszczędność pamięciowaOszczędność pamięciowa Data sceny << game dataData sceny << game data

Optymalizacja gier Double-BufferingDouble-Buffering Update Render Update Render Update Render

Optymalizacja gier Double-BufferingDouble-Buffering Czasy klatek nigdy nie są identyczneCzasy klatek nigdy nie są identyczne Starty czasy wykonawczego podczas oczekiwania na synchronizacjeStarty czasy wykonawczego podczas oczekiwania na synchronizacje Rozwiązuje problem równoległych obliczeńRozwiązuje problem równoległych obliczeń Start dalej następuje w tym samym momencieStart dalej następuje w tym samym momencie Możliwe triple, quadraple, n – buffering amortyzując koszta oczekiwania na synchronizacje przez narzut pamięciowyMożliwe triple, quadraple, n – buffering amortyzując koszta oczekiwania na synchronizacje przez narzut pamięciowy

Optymalizacja gier Double-BufferingDouble-Buffering Więcej buforów = mniej marnowanego czasuWięcej buforów = mniej marnowanego czasu Ale również większe opóźnienia zapisuAle również większe opóźnienia zapisu Jeden bufor – update aktualnej klatkiJeden bufor – update aktualnej klatki 2 – 1 klatka w tył2 – 1 klatka w tył 3 – 2 klatki w tył etc..3 – 2 klatki w tył etc.. Frame 2 Frame 3 Update Render Frame 4 Frame 5 Frame 2 Frame 3 Frame 4 Frame 1 Frame 6 Frame 7 Frame 5

Optymalizacja gier Multiframe processingMultiframe processing Frame N Frame N-m Update Render Game Data Scene Data Frame N-1

Optymalizacja gier SubFrame ProcessingSubFrame Processing HUD Objects Update Render Game Data Scene Data Actors Map

Optymalizacja gier SubFrame ProcessingSubFrame Processing + Małe opóźnieniaMałe opóźnienia Małe buforyMałe bufory Większa wydajnoścWiększa wydajnośc - Kaskadowe aktualizacjeKaskadowe aktualizacje Jedna faza musi się zakończyć by następna mogła trwaćJedna faza musi się zakończyć by następna mogła trwać Brak zmian bufora po zamknięciu fazyBrak zmian bufora po zamknięciu fazy

Optymalizacja gier Równoległość wykonywania zadańRównoległość wykonywania zadań Podział zadaniowyPodział zadaniowy Wydzielenie wątkówWydzielenie wątków Render (T1)Render (T1) SceneScene AnimationAnimation Update (T2)Update (T2) AIAI PhisicsPhisics Wykonywanie pojedynczych zadań wielowątkowoWykonywanie pojedynczych zadań wielowątkowo

Optymalizacja gier Równoległość wykonywania zadańRównoległość wykonywania zadań Podział zadaniowyPodział zadaniowy Wydzielenie wątkówWydzielenie wątków Render (MT1)Render (MT1) Scene (T1_1…T1_N)Scene (T1_1…T1_N) Animation (T2_1…T2_N)Animation (T2_1…T2_N) Update (MT2)Update (MT2) AI (T3_1…T3_N)AI (T3_1…T3_N) Phisics (T4_1…T4_N)Phisics (T4_1…T4_N)

Optymalizacja gier Równoległość wykonywania zadańRównoległość wykonywania zadań Update Render Update Render

Optymalizacja gier Równoległość wykonywania zadańRównoległość wykonywania zadań Partycjonowanie danychPartycjonowanie danych pakietowaniepakietowanie Proste zależności między danymiProste zależności między danymi Określony i przewidywalny potok wykonawczy danychOkreślony i przewidywalny potok wykonawczy danych Przewidywalny zakres konkretnych danych obliczeniowychPrzewidywalny zakres konkretnych danych obliczeniowych

Pytania ?