Architektury wielopotokowe Michał Drobot
Multithreading 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ść oprogramowania użytkowegoPrzyszłość oprogramowania użytkowego Standard aplikacji wysokowydajnychStandard aplikacji wysokowydajnych GryGry X360, PS3X360, PS3 Stanowi wyzwanie architektoniczne jak i sprzętoweStanowi wyzwanie architektoniczne jak i sprzętowe
Multithreading 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 Procesory wektorowe 1,2,3,4…Procesory wektorowe 1,2,3,4… 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
Multithreading 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
Architektury ogólne CPUCPU Szybkie CPU jedno-rdzenioweSzybkie CPU jedno-rdzeniowe Wirtualizacja MTWirtualizacja MT CPU Homogeniczne / Symetryczne (PC, XBOX)CPU Homogeniczne / Symetryczne (PC, XBOX) Duże rdzenie, 1-2 wątków sprzętowych na rdzeńDuże rdzenie, 1-2 wątków sprzętowych na rdzeń Skomplikowane przetwarzanie instrukcji OUT-OF-ORDER (utrudnienie lockless programming)Skomplikowane przetwarzanie instrukcji OUT-OF-ORDER (utrudnienie lockless programming) Procesory ogólnego zastosowania, ciężkie zunifikowane wątki, szybkie pojedynczoProcesory ogólnego zastosowania, ciężkie zunifikowane wątki, szybkie pojedynczo CPU Heterogeniczne (Cell)CPU Heterogeniczne (Cell) 1-2 dużych rdzeni ogólnego zastosowania1-2 dużych rdzeni ogólnego zastosowania Liczne małe rdzenie typu IN-ORDER, z lokalna pamięcią, kontroler DMALiczne małe rdzenie typu IN-ORDER, z lokalna pamięcią, kontroler DMA Specjalizowane, np. procesory wektorowe SIMDSpecjalizowane, np. procesory wektorowe SIMD Bardzo szybkie w swoich zastosowaniachBardzo szybkie w swoich zastosowaniach
Architektury ogólne GPUGPU Procesory potokoweProcesory potokowe Wielostopniowe procesory o wyspecjalizowanych jednostkach (np. merger, vertex shader, pixel shader)Wielostopniowe procesory o wyspecjalizowanych jednostkach (np. merger, vertex shader, pixel shader) Zunifikowane jednostki obliczenioweZunifikowane jednostki obliczeniowe Tysiące małych rdzeniTysiące małych rdzeni Lekkie wątki, wolne pojedynczo, szybkie poprzez ilośćLekkie wątki, wolne pojedynczo, szybkie poprzez ilość Specjalizowane procesory wektorowe do obliczeń zmiennoprzecinkowych SIMDSpecjalizowane procesory wektorowe do obliczeń zmiennoprzecinkowych SIMD Dużo szybsze w swoich zastosowaniach od ogólnych CPUDużo szybsze w swoich zastosowaniach od ogólnych CPU
Architektury ogólne GPUGPU Różne modele adopcjiRóżne modele adopcji DX9DX9 Konwencjonalny model procesora do obliczeń grafikiKonwencjonalny model procesora do obliczeń grafiki Standardowe potoki oraz etapy obliczeń ukierunkowane na grafikęStandardowe potoki oraz etapy obliczeń ukierunkowane na grafikę Możliwość zaadaptowania vertex/pixel shaderów do obliczeń ogólnego zastosowaniaMożliwość zaadaptowania vertex/pixel shaderów do obliczeń ogólnego zastosowania Brak współdzielenia pamięci => SIMDBrak współdzielenia pamięci => SIMD GPGPUGPGPU DX10DX10 Zunifikowane jednostki wykonawczeZunifikowane jednostki wykonawcze Duża konfigurowalność potokówDuża konfigurowalność potoków Podstawowe GPGPU (CUDA, OpenCL, STREAM)Podstawowe GPGPU (CUDA, OpenCL, STREAM) Brak pełnego współdzielenia pamięci => SIMDBrak pełnego współdzielenia pamięci => SIMD Łatwość komunikacji CPU GPUŁatwość komunikacji CPU GPU
Architektury ogólne GPUGPU Różne modele adopcjiRóżne modele adopcji GPGPUGPGPU DX11DX11 Zunifikowane procesoryZunifikowane procesory Większa programowalnośćWiększa programowalność Wprowadzenie architektury MIMDWprowadzenie architektury MIMD Współdzielenie pamięci między wątkamiWspółdzielenie pamięci między wątkami Prawdziwe architektury wielowątkowePrawdziwe architektury wielowątkowe Wsparcie dla mechanizmów znanych z C++Wsparcie dla mechanizmów znanych z C++ Ułatwienie komunikacji i wymiany danych między CPU a GPUUłatwienie komunikacji i wymiany danych między CPU a GPU
Architektury ogólne GPUGPU W zależności od standardu może być traktowany jako równoprawny z CPU zasób obliczeniowy stanowiący wsparcie w zadaniach o charakterze strumieniowymW zależności od standardu może być traktowany jako równoprawny z CPU zasób obliczeniowy stanowiący wsparcie w zadaniach o charakterze strumieniowym Tysiące lekkich wątkówTysiące lekkich wątków Obliczenia wektoroweObliczenia wektorowe
Architektury specyficzne Xbox 360Xbox 360 Power PC 3x3.2 Ghz (6 wątków sprzętowych)Power PC 3x3.2 Ghz (6 wątków sprzętowych) GPU DX10 48 potoków strumieniowychGPU DX10 48 potoków strumieniowych Współdzielona między CPU i GPU pamięć 512mbWspółdzielona między CPU i GPU pamięć 512mb Szybka pamięć podręczna GPU (EDRAM 10mb)Szybka pamięć podręczna GPU (EDRAM 10mb)
Architektury specyficzne PS3PS3 Power PC PPU 1x3.2 Ghz (2 wątki sprzętowe poprzez wirtualizację)Power PC PPU 1x3.2 Ghz (2 wątki sprzętowe poprzez wirtualizację) 7x SPU 3.2 Ghz7x SPU 3.2 Ghz Niekonwencjonalne procesoryNiekonwencjonalne procesory 256 kb pamięci podręcznej bezpośrednio adresowanej (brak cacheu)256 kb pamięci podręcznej bezpośrednio adresowanej (brak cacheu) Lokalny kontroler DMALokalny kontroler DMA Umożliwia transfery I/O danychUmożliwia transfery I/O danych Lokalizacja obliczeńLokalizacja obliczeń Prawdziwy procesor SIMDPrawdziwy procesor SIMD Konkurencyjna obsługa pamięci (2 instrukcje na zegar, 1 ALU, 1 support (branch, store, load…))Konkurencyjna obsługa pamięci (2 instrukcje na zegar, 1 ALU, 1 support (branch, store, load…)) GPU RSX 24 strumienie niezunifikowaneGPU RSX 24 strumienie niezunifikowane
Wymagania silnika Silnik aplikacji wysoko wydajnościowej czasu rzeczywistego (na podstawie gier)Silnik aplikacji wysoko wydajnościowej czasu rzeczywistego (na podstawie gier) WymaganiaWymagania Stabilna wydajność czasu rzeczywistegoStabilna wydajność czasu rzeczywistego Aktualizacje z każdą klatką, 30 fpsAktualizacje z każdą klatką, 30 fps Stabilność obliczeń – czas wykonania ponad jakośćStabilność obliczeń – czas wykonania ponad jakość Przewidywalne zużycie pamięciPrzewidywalne zużycie pamięci Ustalane z góry limity pamięcioweUstalane z góry limity pamięciowe Przekroczenia budżetu – katastrofalnePrzekroczenia budżetu – katastrofalne Unikanie alokacji w RTUnikanie alokacji w RT Preferowana pamięć zunifikowanaPreferowana pamięć zunifikowana Cross-platformowośćCross-platformowość Jednoczesna obsługa wielu architekturJednoczesna obsługa wielu architektur PC (Intel, Amd, xCore)PC (Intel, Amd, xCore) PowerPC – Xbox360PowerPC – Xbox360 Cell – Ps3Cell – Ps3
Architektury oprogramowania Wątki OSWątki OS Standardowa metodaStandardowa metoda Skuteczne dla małej #rdzeniSkuteczne dla małej #rdzeni Mało inwazyjnaMało inwazyjna Wspomagana systemowoWspomagana systemowo Złożoność rośnie nieliniowoZłożoność rośnie nieliniowo Trudność w zbalansowaniu obciążeniaTrudność w zbalansowaniu obciążenia Dekompozycja na samodzielne pracy jobsDekompozycja na samodzielne pracy jobs Inwazyjne przepisywanie danychInwazyjne przepisywanie danych Bardzo skalowalneBardzo skalowalne Łatwość obsługi dodatkowych elementów obliczeniowych (GPU, SPU)Łatwość obsługi dodatkowych elementów obliczeniowych (GPU, SPU) Dobre dla procesorów heterogenicznychDobre dla procesorów heterogenicznych Zarządzane przez procesor ogólnego przeznaczenia (PPU)Zarządzane przez procesor ogólnego przeznaczenia (PPU)
Job processing system Proste skalowalne praceProste skalowalne prace Dobrze określone I/ODobrze określone I/O Niezależna, bezstanowa, natychmiastowa, zawsze kończąca sięNiezależna, bezstanowa, natychmiastowa, zawsze kończąca się Prace dodawane do list zadańPrace dodawane do list zadań Listy zadańListy zadań Prosta synchronizacja poprzez tokeny sygnału i synchronizacjiProsta synchronizacja poprzez tokeny sygnału i synchronizacji Czas synchronizacji ukryty w mnogości i równoległości pracCzas synchronizacji ukryty w mnogości i równoległości prac Wykonywane asynchronicznieWykonywane asynchronicznie
Job processing system SynchronizacjaSynchronizacja Zbyt długie oczekiwanie zabija efekt równoległościZbyt długie oczekiwanie zabija efekt równoległości Prace zależne od siebie == ZUOPrace zależne od siebie == ZUO Decyzje architektoniczneDecyzje architektoniczne Dopuszczalne wykonanie pracy = 1 klatkaDopuszczalne wykonanie pracy = 1 klatka Wyniki danej pracy dostępne z opóźnieniemWyniki danej pracy dostępne z opóźnieniem Wymaga odmiennego podejścia do algorytmówWymaga odmiennego podejścia do algorytmów Eliminuje niektóre zastosowaniaEliminuje niektóre zastosowania Ogólnie zysk z równoległości zadań przebija stratyOgólnie zysk z równoległości zadań przebija straty
Job based system Poziomy pracPoziomy prac Kod zarządzający (C++) – CPUKod zarządzający (C++) – CPU Systemowe prace CPU (C++)Systemowe prace CPU (C++) Systemowe prace SPU (C++/asm)Systemowe prace SPU (C++/asm) Kernele obliczeniowe (GP)GPU (HLSL)Kernele obliczeniowe (GP)GPU (HLSL)
Job based system Kod zarządzającyKod zarządzający Główny kod aplikacjiGłówny kod aplikacji Niska gęstość obliczeńNiska gęstość obliczeń Duże rozproszenie pamięcioweDuże rozproszenie pamięciowe Skakanie wskaźnikówSkakanie wskaźników Kod trudny do urównolegleniaKod trudny do urównoleglenia OUT-OF-ORDEROUT-OF-ORDER Konsole działają w trybie IN-ORDERKonsole działają w trybie IN-ORDER Duża złożoność logicznaDuża złożoność logiczna Stanowi klej łączący wszystkie zlecane zadaniaStanowi klej łączący wszystkie zlecane zadania
Job based system Systemowe praceSystemowe prace CPU jobCPU job Kod przeniesiony z wątku do pracyKod przeniesiony z wątku do pracy SPU jobSPU job Kod zorientowany na daneKod zorientowany na dane BezstanowyBezstanowy Lokalny pamięciowoLokalny pamięciowo Jeśli brak dedykowanego sprzętu => CPU jobJeśli brak dedykowanego sprzętu => CPU job GPGPU jobGPGPU job Kod specjalizowanyKod specjalizowany Zorientowany na daneZorientowany na dane Wysoce optymalizowanyWysoce optymalizowany Wykonywany na GPUWykonywany na GPU
Job based system
Budowanie grafów pracBudowanie grafów prac Miksowanie CPU/SPU/GPU JobsMiksowanie CPU/SPU/GPU Jobs Batching – zlecanie zadań na dużych ilościach danychBatching – zlecanie zadań na dużych ilościach danych Podział danych pomiędzy równoległe pracePodział danych pomiędzy równoległe prace Zależności między pracami determinująZależności między pracami determinują Kolejność wykonaniaKolejność wykonania Punkty synchronizacjiPunkty synchronizacji Balans obciążenia systemuBalans obciążenia systemu Efektywność równoległości obliczeńEfektywność równoległości obliczeń
Job based system Maksymalizacja równoległości zadańMaksymalizacja równoległości zadań
Przyszłość Obecne trendy obliczeń HP RTObecne trendy obliczeń HP RT Systemy nastawione na krótkie, szybkie praceSystemy nastawione na krótkie, szybkie prace Obsługujące liczne procesory o różnych charakterystykachObsługujące liczne procesory o różnych charakterystykach Dobór odpowiedniego procesora do rodzaju zleconego zadaniaDobór odpowiedniego procesora do rodzaju zleconego zadania Nastawienie na wymianę danychNastawienie na wymianę danych Równoległość obliczeńRównoległość obliczeń
Przyszłość TrendyTrendy Wieloprocesorowe systemy licząceWieloprocesorowe systemy liczące Zunifikowana pamięćZunifikowana pamięć Minimalizacja opóźnieńMinimalizacja opóźnień Wysoka specjalizacja procesorówWysoka specjalizacja procesorów Bądź ujednolicona architekturaBądź ujednolicona architektura Obecnie projekt AMD Fusion – integracja CPU z GPUObecnie projekt AMD Fusion – integracja CPU z GPU Równoległość przetwarzania z lokalizacją danychRównoległość przetwarzania z lokalizacją danych
Pytania ?