Procesory wielordzeniowe (multiprocessor on a chip) 1
Procesory wielordzeniowe 2
Procesory wielordzeniowe 3
Intel Nehalem 4
5
NVIDIA Tesla 6
ATI FireStream 7
NVIDIA Fermi 8
Sprzętowa wielowątkowość 9
Architektury hybrydowe 1
Zasoby węzła z pamiecią wspólną 11
Wydajność pamięci 1 2 3 4 5 6 7 8 STREAM (GB/s) 5.57 1.71 8.53 11.3 9.25 8.55 7.3 8.46 mat_vec (sek.).22.13.14.11.13.14.12.12 12
Przypisanie wątków, rdzeni i pamięci $likwid-topology CPU: Intel(R) Core(TM) i7-479 CPU @ 3.6GHz Intel Core Haswell processor ******************************************************************************** Hardware Thread Topology: Sockets: 1 Cores per socket: 4 Threads per core: 2 -------------------------------------------------------------------------------HWThread Thread Core Socket 1 1 2 2 3 3 4 1 5 1 1 6 1 2 7 1 3 Socket : (4152637) ******************************************************************************** Cache Topology: Level: 1 Size: 32 kb Cache groups: (4)(15)(26)(37) -------------------------------------------------------------------------------Level: 2 Size: 256 kb Cache groups: (4)(15)(26)(37) -------------------------------------------------------------------------------Level: 3 Size: 8 MB Cache groups: (4152637) ******************************************************************************** NUMA Topology: Domain: Processors: (4152637) 13
Test STREAM dla Intel Sandy Bridge Wpływ przypięcia (pinning) wątków do rdzeni 14
Roofline performance model Attainable GPLOPs/sec = Max ( Peak Memory BW Arithmetic Intensity, Peak FP Performance ) Przykłady obliczeń (BLAS 2, BLAS 3) 15
Roofline performance model 16
Systemy wieloprocesorowe Problem podstawowy: wielowątkowy dostęp do hierarchii pamięci (mikroprocesory wielordzeniowe) L1 prywatna dla procesora (rdzenia) L2 prywatna lub w pewien sposób współdzielona L3 wspólna dla mikroprocesora (jeśli jest) Problemy konkretne: spójność pamięci podręcznej wydajność dostępu minimalizacja liczby chybień false sharing i wspólna sterta dla wątków 17
Systemy wieloprocesorowe Problemy szeregowania zadań dla systemów wieloprocesorowych afiniczność i lokalność odniesień do pamięci sterowanie za pomocą np. numactl, sched_setaffinity, sched_getaffinity, zmiennych środowiskowych KMP_AFFINITY, GOMP_AFFINITY, opcji mpirun, mpiexec GOMP_AFFINITY=<proc_list>, np. [,1,2,3,4,...] KMP_AFFINITY="granularity=fine,proclist=[<proc_list>],explicit" podział zadań i iteracji pętli uwzględniający afiniczność Systemy NUMA zaleta: skalowalność przepustowości pamięci problemy: lokalne chybienia pamięci podręcznej odległe (zdalne, remote) chybienia pamięci podręcznej koszt false sharing 18
NUMA Architektura AMD Opteron 19
Tendencje Mało dużych rdzeni rozbudowane potoki wykonanie poza kolejnością wyrafinowane przewidywanie rozgałęzień wiele jednostek funkcjonalnych Dużo małych rdzeni prostsza budowa, krótsze potoki wykonanie w kolejności proste przewidywanie rozgałęzień mniej jednostek funkcjonalnych 2
Programowanie procesorów wielordzeniowych Standardy programowania: wątki: systemowe, POSIX, w ramach języków programowania: Java, C++ dyrektywy programowania wielowątkowego: OpenMP, OpenACC specjalne środowiska: zarządzanie wątkami GPU realizującymi programy w specjalnych językach: CUDA, OpenCL specjalne języki programowania równoległego: Cilk, UPC, Ada, Erlang, C++AMP, Linda i wiele, wiele innych 21
Wydajność systemów z pamięcią wspólną Czas dostępu do danych prywatnych zależy od sprzętu Dostęp do danych wspólnych wymaga synchronizacji klasyczna synchronizacja zamki (muteksy), zmienne warunku operacje atomowe Operacje atomowe wspierane sprzętowo są najefektywniejszym sposobem synchronizacji implementacja zamków, zmiennych warunku korzysta z operacji atomowych operacje atomowe można bezpośrednio wykorzystywać w implementacji współbieżnych struktur danych Rozwijaną w ostatnich latach alternatywą jest korzystanie z pamięci transakcyjnej (na razie mało wydajne) 22
Wydajność systemów wielordzeniowych Narzut wykonania: procedury systemowe: tworzenie i zarządzanie wątkami synchronizacja współdzielenie zasobów procesora: pamięci podręczne (L2?, L3, TLB?) dostęp do pamięci głównej Wydajność wykonania równoległego może znacząco różnić się pomiędzy różnymi uruchomieniami tego samego kodu! 23
Modelowanie wydajności Określenie czasu wykonania T konkretnego programu, na konkretnym sprzęcie,dla konkretnego egzemplarza danych Czas wykonania można wyrazić wzorem: T = Tcomp + Tmem + Tnarzut Toverlap exec przybliżone oszacowania aproksymują pewne z powyższych wartości i pomijają pozostałe dwa typowe podejścia: T = Tcomp ; pozostałe pominięte (dla programów o exec wydajności ograniczanej przez procesor) Texec = Tmem ; pozostałe pominięte (dla programów o wydajności ograniczanej przez pamięć) 24
Modelowanie wydajności Jak uzyskać Tcomp i Tmem? wzór ogólny: T = 1 / wydajność wydajność może pochodzić z: analizy sprzętu (zazwyczaj zawyżona, pytanie o ile) (mikro)benchmarków muszą być reprezentatywne i dla sprzętu, i dla programu, i dla danych mnożenie macierz-macierz jest często wykorzystywanym benchmarkiem dla programów o wydajności ograniczanej przez procesor, a test STREAM dla programów o wydajności ograniczanej przez pamięć 25
Optymalizacja wydajności Wydajność w (mikro)benchmarkach zazwyczaj zakłada optymalną realizację operacji Jeśli czas wykonania znacząco odbiega od czasu przewidywanego przez model (wydajność znacząco odbiega od wydajności z testów) należy przeprowadzić optymalizację Optymalizacja polega na minimalizacji narzutu i maksymalizacji nakładania się poszczególnych operacji (operacje na liczbach całkowitych, zmiennoprzecinkowych, dostępy do pamięci) 26
Optymalizacja wydajności Optymalizacja poprzez usuwanie kolejnych przeszkód na drodze do wydajności wskazywanej przez testy i możliwości sprzętu nazywana jest optymalizacją wąskiego gardła (bottleneck optimization) sposób postępowania polega na wyodrębnieniu w kodzie fragmentów odpowiedzialnych za wydłużanie czasu wykonania (na podstawie profilu wykonania), a następnie na optymalizacji poprzez usuwanie narzutów i ewentualne zwiększanie współczynnika intensywności obliczeń (arithmetic intensity) 27
Pamięć w systemach wieloprocesorowych AK Działanie pamięci podręcznej: strategie utrzymywania zgodności pamięci podręcznej (cache coherence protocols) write through każdy zapis do pamięci podręcznej jest przenoszony do pamięci głównej copy back zapis do pamięci podręcznej jest przenoszony do pamięci głównej przy podmianie linii (linia musi wiedzieć czy była zmieniona) inne, bardziej złożone np. MESI 28
Protokoły zgodności pamięci podręcznej AK protokoły katalogowe (directory protocols) istnieje katalog z informacją o zawartości pamięci podręcznej i centralny sterownik katalogu pośredniczący w wymianie danych protokoły podglądania (snoopy protocols) procesory podglądają stan pamięci podręcznych i rozgłaszają zmiany zapis z aktualizacją (procesor dokonujący zmianę rozgłasza ją i wszystkie procesory aktualizują swoje pamięci podręczne) zapis z unieważnieniem (procesor dokonujący zmiany unieważnia zawartość pamięci podręcznych innych procesorów); przykład MESI 29
Protokół MESI AK Blok w pamięci podręcznej może być w jednym z czterech stanów: M (modified): zmodyfikowany w pamięci podręcznej, różny od odpowiedniego bloku w pamięci głównej E (exclusive): wyłącznie w jednej pamięci podręcznej, zawartość identyczna jak w pamięci głównej S (shared): w kilku pamięciach podręcznych, zawartość identyczna jak w pamięci głównej I (invalid): unieważniony przez zmiany dokonane w innej pamięci podręcznej 3