Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałKrzysztof Miszczuk Został zmieniony 10 lat temu
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
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.