Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

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

Podobne prezentacje


Prezentacja na temat: "Multithreading Michał Drobot. Plan wykładu Multi-threadingMulti-threading Metody synchronizacjiMetody synchronizacji Lock-lessLock-less Operacje niskopoziomowe,"— Zapis prezentacji:

1 Multithreading Michał Drobot

2 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

3 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

4 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

5 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

6 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

7 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); }

8 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

9 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

10 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

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

12 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

13 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

14 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)

15 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

16 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)

17 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);

18 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

19 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()

20 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

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

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

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

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

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

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

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

28 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)

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

30 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

31 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

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

33 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

34 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

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

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

37 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

38 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

39 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)

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

41 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

42 Pytania ? hello@drobot.org hello@drobot.org michal.drobot@ega.org.pl hello@drobot.org


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

Podobne prezentacje


Reklamy Google