COMPUTER ORGANIZATION AND DESIGN The Hardware/Software Interface Wprowadzenie do systemów wieloprocesorowych Wstęp Do tej pory mówiliśmy głównie o systemach z jednym procesorem Coraz trudniej wycisnąć więcej z pojedynczego procesora (ograniczenia fizyczne) Aby uzyskać większą wydajność musimy myśleć o systemach z wieloma procesorami Obecnie większość maszyn (serwery, PC, laptopy, konsole, nawet telefony komórkowe) ma wiele procesorów Duże zróżnicowanie systemów wieloprocesorowych (od układów dwurdzeniowych do układów z tysiącami procesorów) Wstęp Urównoleglanie różnych operacji już widzialiśmy: Carry-select adder, array multiplier Przetwarzanie potokowe Przetwarzanie superskalarne VLIW (very large instruction word) Wstęp Cel: połączyć wiele CPU w celu uzyskania większej wydajności: Multiprocessors Skalowalność, Uproszczenie budowy pojedynczego CPU Zużycie energii Równoległość na poziomie niezależnych zadań (procesów) Równoległe wykonanie pojedynczego zadania na wielu procesorach Chapter 6 — Parallel Processors from Client to Cloud — 4 Hardware i Software Hardware Software serial: np. Intel Pentium 4 parallel: np. Intel Core i7 sequential: np. eliminacja Gaussa concurrent: e.g., operating system Sequential/concurrent software może działać na on serial/parallel hardware Challenge: efektywnie wykorzystać równoległy hardware Chapter 6 — Parallel Processors from Client to Cloud — 5 Programowanie równoległe Pisanie efektywnego oprogramowania równoległego nie jest łatwe Problemy: Podział zadania na części Koorydancje wykonania Komunikacja Chapter 6 — Parallel Processors from Client to Cloud — 6 Prawo Amdahl’a Część zadania może mieć charakter sekwencyjny i nie daje się urównoleglić Przykład: 100 procesorów, 90×speedup? Tnew = Tparallelizable/100 + Tsequential 1 Speedup 90 (1 Fparallelizable ) Fparallelizable /100 Fparallelizable = 0.999 Sekwencyjna część zadania nie może zająć więcej niż 0.1% oryginalnego czasu Chapter 6 — Parallel Processors from Client to Cloud — 7 Skalowalność: przykład Zadanie: suma 10 skalarów, oraz suma dwóch macierzy 10 × 10 1 procesor: Time = (10 + 100) × tadd 10 procesorów Time = 10 × tadd + 100/10 × tadd = 20 × tadd Speedup = 110/20 = 5.5 (55% of optymalnego) 100 procesorów 1, 10, 100 procesorów Time = 10 × tadd + 100/100 × tadd = 11 × tadd Speedup = 110/11 = 10 (10% optymalnego) Zakładamy, że dane mogą być równomiernie przydzielone do procesorów Chapter 6 — Parallel Processors from Client to Cloud — 8 Skalowalność: przykład cd Co jeśli rozmiar macierzy jest 100 × 100? 1 processor: Time = (10 + 10000) × tadd 10 procesorów Time = 10 × tadd + 10000/10 × tadd = 1010 × tadd Speedup = 10010/1010 = 9.9 (99% of potential) 100 procesorów Time = 10 × tadd + 10000/100 × tadd = 110 × tadd Speedup = 10010/110 = 91 (91% of potential) Chapter 6 — Parallel Processors from Client to Cloud — 9 Silna i słaba skalowalność Silna skalowalność: stały rozmiar problemu Słaba skalowalność: rozmiar problemu proporcjonalny do liczby procesorów 10 procesorów, macierz 10 × 10 100 procesorów, macierz 32 × 32 Time = 20 × tadd Time = 10 × tadd + 1000/100 × tadd = 20 × tadd Stała efektywność Chapter 6 — Parallel Processors from Client to Cloud — 10 Teoria algoryt. równoległych Istnieją teoretyczne modele obliczeń równoległych (PRAM) Klasa problemów dobrze się ,,urównoleglających'': NC (rozwiązywalne w czasie polilogarytmicznym na wielominowej liczbie procesorów) Status NC=P? podobny do P=NP? W NC: mnożenie macierzy, sortowanie P-zupełne: circuit value, linear programming Chapter 6 — Parallel Processors from Client to Cloud — 11 Strumienie instrukcji i danych Klasyfikacja Flynn'a (1960s) Data Streams Single Instruction Single Streams Multiple Multiple SISD: Intel Pentium 4 SIMD: SSE instructions of x86 MISD: No examples today MIMD: Intel Core I7 Chapter 6 — Parallel Processors from Client to Cloud — 12 SIMD Operują na wektorach danych Procesory wykonują tą samą instrukcję Np., rozszerzenia MMX, SSE, AVX architektury x86 Ale na innych danych Prosta synchonizacja Dobre do zastosowań ,,data-parallel'' Chapter 6 — Parallel Processors from Client to Cloud — 13 Przykład: DAXPY (Y = a × X + Y) Standardowy kod MIPS: l.d $f0,a($sp) addiu r4,$s0,#512 loop: l.d $f2,0($s0) mul.d $f2,$f2,$f0 l.d $f4,0($s1) add.d $f4,$f4,$f2 s.d $f4,0($s1) addiu $s0,$s0,#8 addiu $s1,$s1,#8 subu $t0,r4,$s0 bne $t0,$zero,loop Kod na wektorową wersję MIPS: l.d $f0,a($sp) lv $v1,0($s0) mulvs.d $v2,$v1,$f0 lv $v3,0($s1) addv.d $v4,$v2,$v3 sv $v4,0($s1) ;load scalar a ;upper bound of what to load ;load x(i) ;a × x(i) ;load y(i) ;a × x(i) + y(i) ;store into y(i) ;increment index to x ;increment index to y ;compute bound ;check if done ;load scalar a ;load vector x ;vector-scalar multiply ;load vector y ;add y to product ;store the result Chapter 6 — Parallel Processors from Client to Cloud — 14 Procesory wektorowe Silnie potokowe jednostki wykonawcze Dane przesyłane z rejestrów wektorowych do jednostek wykonawczych Pobierane z pamięci do rejestrów Zapisywane z rejestrów do pamięci Przykład: Wektorowe rozszerzenie MIPS 32 wektory 64-elementowe (elementy 64-bitowe) Instrukcje wektorowe lv, sv: load/store wektor addv.d: dodaj wektory addvs.d: dodaj skalar do każdego elementu wektora Mała liczba pobieranych instrukcji Chapter 6 — Parallel Processors from Client to Cloud — 15 Wektorowe kontra skalarne Architektura wektorawa: Ułatwia pisanie programów ,,data-parallel'' Krótsze pętle (lub ich brak) – brak hazardów sterowania Mniej hazardów danych Przy regularnym wzorze dostępów zysk z pamięci z przeplotem (interleaved) Ogólniejsza niż multimedia extensions (jak MMX, SSE) Lepiej zgrywają się z kompilatorami Chapter 6 — Parallel Processors from Client to Cloud — 16 Wektorowe kontra MMX, SSE Rozkazy wektorowe operują na wektorach różnej długości, rozszerzenia multimedialne: stałej Rozkazy wektorowe mogą tworzyć wektory ,,z co którejś danej w pamięci''; MMX – z kolejnych Jednostki wektorowe mogą być kombinacją jednostek potokowych i macierzowych Chapter 6 — Parallel Processors from Client to Cloud — 17 Wielowątkowość Wiele wątków procesu wykonywanych równolegle Fine-grain multithreading Zdublowane rejestry, PC, ... Szybkie przełączanie między wątkami Przełącznie po każdym cyklu Przeplot rozkazów Jeśli jeden wątek czeka – pozostałe działają Coarse-grain multithreading Przełączamy wątki przy długich przestojach (np. chybieniach w cache L2) Prostszy sprzęt, ale nie ukrywa krótszych przestojów (np. związanych z hazardami danych) Chapter 6 — Parallel Processors from Client to Cloud — 18 Simultaneous Multithreading Dotyczy procesorów superskalarnych z dynamicznym przydziałem Przydzielamy istrukcje z różnych wątków jednocześnie O ile są wolne jednostki wykonawcze Przykład: Intel Pentium-4 HT Dwa wątki: zdublowane rejestry, współdzielone jednostki wykonawcze i cache Chapter 6 — Parallel Processors from Client to Cloud — 19 Multithreading - przykład Chapter 6 — Parallel Processors from Client to Cloud — 20 MIMD: współdzielona pamięć SMP: shared memory multiprocessor Wspólna przestrzeń adresowa dla wszystkich procesorów Komunikacja za pomocą współdzielonych zmiennych I specjalnych rozkazów synchronizujących Dwa warianty, w zależności od rodzaju dostępu do pamięci: UMA (uniform) vs. NUMA (nonuniform) Chapter 6 — Parallel Processors from Client to Cloud — 21 Przykład: Sumowanie Sumujemy 100,000 liczb na 100 proc. UMA Każdy procesor ma ID: 0 ≤ Pn ≤ 99 Przydzialemy 1000 liczb każdemu procesorowi Każdy procesor sumuje swoje liczby: sum[Pn] = 0; for (i = 1000*Pn; i < 1000*(Pn+1); i = i + 1) sum[Pn] = sum[Pn] + A[i]; Dodajemy te częściowe sumy Stragegia dziel i zwyciężaj Połowa procesorów sumuje wyniki z par procesorów, potem działa jedna czwarta procesorów itd. Potrzebna synchronizacja Chapter 6 — Parallel Processors from Client to Cloud — 22 Przykład: sumowanie half = 100; repeat synch(); if (half%2 != 0 && Pn == 0) sum[0] = sum[0] + sum[half-1]; /* Conditional sum needed when half is odd; Processor0 gets missing element */ half = half/2; /* dividing line on who sums */ if (Pn < half) sum[Pn] = sum[Pn] + sum[Pn+half]; until (half == 1); Chapter 6 — Parallel Processors from Client to Cloud — 23 Grafika w systemie komp. Chapter 6 — Parallel Processors from Client to Cloud — 24 Architektury GPU Przetwarzanie typu ,,data-parallel'' GPUs są silnie wielowątkowe Przełączanie wątków pozwala ukryć opóźnienie spowodowane dostępem do pamięci Pamięć grafiki – szeroka, duża przepustowość Trend: użycie GPUs do innych zadań Mniejsza rola cache Heterogeniczny system CPU/GPU CPU – zadanie sekwencyjne, GPU - równoległe Środowiska programistyczne i języki: DirectX, OpenGL C for Graphics (Cg), High Level Shader Language (HLSL) Compute Unified Device Architecture (CUDA) Chapter 6 — Parallel Processors from Client to Cloud — 25 MIMD: komunikacja sieciowa Każdy procesor ma prywatną przestrzeń adresową Komunikacja za pomocą wiadomości przesyłanych siecią Chapter 6 — Parallel Processors from Client to Cloud — 26 Loosely Coupled Clusters Sieć niezależnych komputerów Każdy z pamięcią prywatną i własnymOS Połączenia za pomocą I/O Dobre do zastosowań z niezależnymi zadaniami Np., Ethernet/switch, Internet Serwery WWW, bazy danych, symulacje, … Łatwo dostępne, skalowalne, niedrogie Problemy Koszt zarządzania Mała przepustowość komunikacji Chapter 6 — Parallel Processors from Client to Cloud — 27 Sumowanie raz jeszcze Sumujemy 100,000 liczb na 100 proc. Rozsyłamy po 1000 liczb Wyliczamy sumy częściowe sum = 0; for (i = 0; i<1000; i = i + 1) sum = sum + AN[i]; Składanie wyniku Połowa procesorów wysyła, połowa odbiera dodaje Jedna czwarta wysyła, jedna czwarta odbiera i dodaje, … Chapter 6 — Parallel Processors from Client to Cloud — 28 Sumowanie raz jeszcze Mamy operacje send(), receive() limit = 100; half = 100;/* 100 processors */ repeat half = (half+1)/2; /* send vs. receive dividing line */ if (Pn >= half && Pn < limit) send(Pn - half, sum); if (Pn < (limit/2)) sum = sum + receive(); limit = half; /* upper limit of senders */ until (half == 1); /* exit with final sum */ Send/receive zapewniają synchronizację Chapter 6 — Parallel Processors from Client to Cloud — 29 Grid Computing Samodzielne maszyny połączone np. za pomocą internetu Np. SETI@home Chapter 6 — Parallel Processors from Client to Cloud — 30