Wstęp. 1
Cel zajęć Zapoznanie z technikami i narzędziami programistycznymi służącymi do tworzenia programów równoległych Przedstawienie sprzętu wykorzystywanego do obliczeń równoległych Nauczenie sposobów tworzenia i implementacji algorytmów równoległych Zapoznanie z technikami analizy programów równoległych oraz rozwiązywania pojawiających się w nich problemów programistycznych Przedstawienie wybranych dziedzin zastosowań przetwarzania równoległego oraz występujących tam algorytmów 2
Historia i pojęcia wstępne Przetwarzanie współbieżne realizacja wielu programów (procesów) w taki sposób, że ich trwanie od momentu rozpoczęcia do momentu zakończenia może się na siebie nakładać współbieżność pojawiła się wraz z wielozadaniowymi systemami operacyjnymi (lata 60 te, Multics 1965) i nie wymusza równoległości współbieżność związana jest z szeregiem problemów teoretycznych wynikłych z prób realizacji wielozadaniowych systemów operacyjnych istnieje wiele mechanizmów niskiego poziomu (systemowych) do rozwiązywania problemów współbieżności 3
Procesy Proces: ciąg rozkazów (wątek główny) i ewentualnie inne wątki stos (wątku głównego) przestrzeń adresowa dodatkowe elementy tworzące m.in. kontekst procesu Tworzenie procesu: pid_t fork( void ) int execv(const char *filename, char *const argv []) pid_t wait(pid_t pid, int *status) 4
Tworzenie procesów main(){ pid = fork(); if(pid==0){ wyn = execl(...); // np. execl( /usr/bin/ls, (char *) 0); if(wyn==...)...; } else { wyn = wait(&stan); (if stan==...)...; } } uwaga: zachowanie zmiennych (w tym globalnych) 5
Historia i pojęcia wstępne Obliczenia równoległe: dwa lub więcej procesów (wątków) jednocześnie współpracuje (komunikując się wzajemnie) w celu rozwiązania pojedynczego zadania (najczęściej z określonej dziedziny zastosowań) rozwój związany z powstaniem w latach siedemdziesiątych komputerów równoległych problemy obliczeń równoległych (poza klasycznymi zagadnieniami współbieżności) są najczęściej związane z konkretnymi algorytmami obliczenia równoległe były silnie związane z dziedziną obliczeń wysokiej wydajności (i obliczeniami naukowo technicznymi) dziś, w czasach procesorów wielordzeniowych, programowanie równoległe jest koniecznością przetwarzanie równoległe jest jedynym sposobem wykorzystania pełnej mocy współczesnego sprzętu 6
Motywacja 7
Architektura von Neumanna Program i dane w pamięci komputera Pojedynczy procesor: pobiera rozkaz z pamięci rozkodowuje rozkaz i znajduje adresy argumentów pobiera dane z pamięci wykonuje operacje na danych zapisuje wynik w pamięci 8
Architektura von Neumanna 9
Klasyfikacja Flynna Zwielokrotnienie strumieni przetwarzania rozkazów i danych klasyfikacja Flynna SISD (oryginalna architektura von Neumanna) SIMD jeden strumień rozkazów i wiele strumieni danych MISD wiele strumieni rozkazów i jeden strumień danych nie stosowane w praktyce (nie jest to przetwarzanie potokowe, gdzie różne rozkazy są wykonywane na tym samym egzemplarzu danych, ale w kolejnych chwilach czasu ) MIMD wiele strumieni danych i wiele strumieni rozkazów współczesne systemy komputerowe są złożone, realizują zazwyczaj różne typy przetwarzania, z pojedynczymi elementami odpowiadającymi architekturom SISD, SIMD oraz całością odpowiadającą architekturze MIMD z pamięcią wspólna lub rozproszoną 10
Procesory wielordzeniowe Prawo Moore'a wciąż sprawdzające się w praktyce mówi o podwajaniu liczby tranzystorów w pojedynczym układzie scalonym co 18 miesięcy Wykorzystanie tych możliwości do mnożenia etapów przetwarzania potokowego, liczby jednostek funkcjonalnych pracujących nad jednym strumieniem rozkazów i zwiększania częstości taktowania procesorów doprowadziło do kryzysu związanego z wydzielaniem ciepła Rozwiązaniem tego kryzysu jest wykorzystanie prawa Moore'a do umieszczania w jednym układzie wielu rdzeni (czyli praktycznie niewiele okrojonych procesorów) od początków XXI wieku prawo Moore'a może być tłumaczone jako podwajanie liczby rdzeni w pojedynczym układzie 11
Wydzielanie ciepła przez procesory 12
Kierunki rozwoju procesorów Intel 13
14
Intel Knights Landing 15
Architektura procesora G80 16
ATI FireStream 17
18
19
Po co obliczenia równoległe? Lepsze wykorzystanie dostępnego sprzętu 20
Po co obliczenia równoległe? Zwiększenie maksymalnej mocy obliczeniowej 21
Rodzaje przetwarzania równoległego Równoległość na poziomie: pojedynczego rozkazu (instruction level parallelism ILP) potokowość, superskalarność poza kontrolą programisty, w gestii projektanta procesora sekwencji rozkazów tworzących zadanie (task level parallelism), pętli (loop level parallelism) w gestii programisty i twórców kompilatorów wykorzystanie wątków (thread level parallelism) i procesów rozdział kolejno wykonywanych rozkazów pomiędzy procesory/rdzenie podział zadania obliczeniowego na podzadania, przydział poszczególnych zadań procesorom/rdzeniom programów (job level parallelism) jednoczesne wykonywanie niezależnych programów przez system operacyjny (OS level parallelism) w gestii projektantów systemów komputerowych (m.in. systemów operacyjnych) 22
C/C++/Java/C# itp., itd. (źródło - www.tiobe.com) 23
C/C++/Java/C# itp., itd. C++ programmers and programs benefit from the very expressive templating and overloading features of the language, allowing more abstraction and more code reuse than is available in other languages. However, that template processing and overloading is typically expanded and evaluated in the C++ front end. By the time the rest of the compiler sees the program, it s just a C program. The only unique feature in C++ that remains after the front end is exception handling. All the templating is extremely useful for reducing the number of times you have to write an axpy kernel for different data types (float, double, complex, ), but it doesn t increase your expressivity, that is, it doesn t let you write anything you couldn t have written in a C library, however painfully. Michael Wolfe* *Michael Wolfe has developed compilers for over 35 years in both academia and industry, and is now a PGI compiler engineer at NVIDIA Corporation 24