Koncept paralelnog računarstva je opšta organizaciona šema. Paralelno računanje u WinNT-u. Metode za sinhronizaciju paralelne interakcije

Paralelno računarstvo - način organizovanja kompjutersko računarstvo, u kojem se programi razvijaju kao skup računarskih procesa koji se odvijaju istovremeno.

Postoje razne načine implementacija paralelnog računarstva: svaki računarski proces može biti implementiran kao proces operativnog sistema, ili računarski procesi mogu biti skup izvršnih niti unutar jednog procesa. Nit (ili tačnije nit izvršenja) je najmanja jedinica obrade čije izvršenje može dodijeliti kernel operativnog sistema. Više niti izvršavanja može postojati unutar istog procesa i dijeliti resurse kao što je memorija, dok procesi ne dijele te resurse. Paralelni programi se mogu fizički izvršavati ili sekvencijalno na jednom procesoru - naizmjenično mijenjajući korake svakog računskog procesa, ili paralelno - dodjeljivanjem jednog ili više procesora (lociranih u blizini ili distribuiranih u računarskoj mreži) svakom računarskom procesu.

Glavna poteškoća u dizajniranju paralelnih programa je osigurati ispravan slijed interakcija između različitih računarskih procesa, kao i dijeljenje resursa kao npr. RAM ili perifernih uređaja.

U nekim sistemima paralelnog programiranja, prijenos podataka između komponenti je skriven od programera, dok u drugim mora biti eksplicitno specificiran. Eksplicitne interakcije se mogu podijeliti u dvije vrste:

1. Interakcija putem zajedničke memorije (na primjer, u Javi ili C#). Ovaj tip paralelno programiranje obično zahtijeva neki oblik hvatanja kontrole za koordinaciju niti među sobom.

2. Interakcija putem prosljeđivanja poruka. Poruke se mogu razmjenjivati ​​asinhrono ili korištenjem metode randevua, u kojoj je pošiljatelj blokiran dok se njegova poruka ne dostavi. Asinhroni prijenos poruka može biti pouzdan (sa garancijom isporuke) ili nepouzdan. Paralelni sistemi za prosleđivanje poruka su često lakši za razumevanje od sistema deljene memorije i generalno se smatraju superiornim metodom paralelnog programiranja. Razmjena poruka se može efikasno implementirati na simetričnim multiprocesorima sa ili bez zajedničke koherentne memorije.

Ima ih dosta različite tehnologije paralelno programiranje. Štaviše, ove tehnologije se ne razlikuju toliko u programskim jezicima koliko u arhitektonskim pristupima izgradnji paralelnih sistema. Na primjer, neke tehnologije uključuju izgradnju paralelnih rješenja zasnovanih na više računara (i jednog i različite vrste), drugi predlažu rad na jednoj mašini sa nekoliko procesorskih jezgara. Trenutno glavni softverski alati kreiranje paralelnih programa su:

1. OpenMP koristi se u paralelnim sistemima sa zajedničkom memorijom (npr. savremenih kompjutera sa višejezgarnim procesorima);

2. MPI (Message Passing Interface) je standard za sisteme za prenos poruka između paralelno izvršavajućih procesa, koji se koristi u razvoju programa za superračunare;

3. POSIX Threads je standard za implementaciju niti izvršavanja;

4. Operaciona sala Windows sistem ima ugrađenu podršku za višenitne aplikacije za C++ na API nivou;

5. PVM (paralelno Virtuelna mašina) omogućava vam da kombinujete heterogene računare povezane mrežom u zajednički računarski resurs.

Sistemi zasnovani na više računara klasifikovani su kao sistemi za distribuirano računarstvo. Ovakva rješenja se koriste već duže vrijeme. Najupečatljiviji primjer distribuirane računarske tehnologije je MPI (Message Passing Interface). MPI je najčešći standard za razmjenu podataka za paralelno programiranje; MPI pruža programeru jedinstveni mehanizam za interakciju grana unutar paralelna aplikacija bez obzira na arhitekturu mašine (jednoprocesor/multiprocesor sa zajedničkom/odvojenom memorijom), relativnu lokaciju grana (na istom procesoru ili na različitim).

Budući da je MPI prvenstveno namijenjen sistemima sa zajedničkom memorijom, njegovo korištenje za organiziranje paralelnog procesa u sistemu sa zajedničkom memorijom je izuzetno teško i nepraktično. Međutim, ništa vas ne sprječava da napravite MPI rješenja za jednu mašinu.

Ali sistemi paralelnog programiranja za rad na jednoj mašini počeli su se razvijati relativno nedavno. Naravno, ovo nisu suštinski nove ideje, ali je to bilo s pojavom višejezgrenih sistema na tržištu personalni računari, mobilnih uređaja, tehnologije kao što je OpenMP su dobile značajan razvoj.

Veoma je važno da tehnologija paralelnog programiranja podržava mogućnost da se program postepeno napravi paralelnim. Naravno, idealan paralelni program treba odmah biti napisan paralelno, možda na nekom funkcionalnom jeziku gdje se uopće ne postavlja pitanje paralelizacije. Ali u praksi je potrebno postepeno paralelizirati pisani sekvencijalni kako bi se povećale performanse. U ovom slučaju, OpenMP tehnologija će biti vrlo dobar izbor. Omogućava vam da odaberete mjesta u aplikaciji kojima je najpotrebnija paralelizacija i prije svega ih napravite paralelnim. Proces razvoja paralelne verzije može se prekinuti, srednje verzije programa objaviti i vratiti po potrebi. Zbog toga je tehnologija OpenMP postala prilično popularna.

OpenMP (Open Multi-Processing) je skup direktiva kompajlera, bibliotečkih procedura i varijabli okruženja koje su dizajnirane za programiranje višenitnih aplikacija na višeprocesorskim sistemima dijeljene memorije.

OpenMP specifikaciju razvija nekoliko velikih proizvođača. kompjuterska tehnologija I softver, čiji rad regulira neprofitna organizacija pod nazivom OpenMP Architecture Review Board (ARB).

Prva verzija pojavila se 1997. godine, namijenjena za jezik Fortran. C/C++ verzija je razvijena 1998. godine. 2008. godine izašao je OpenMP 3.0. OpenMP interfejs je postao jedna od najpopularnijih tehnologija paralelnog programiranja. OpenMP se uspješno koristi kako u programiranju superračunarskih sistema sa velikim brojem procesora, tako iu desktop korisničkim sistemima ili, na primjer, u Xbox 360.

OpenMP implementira paralelno računanje korištenjem multithreadinga, u kojem “master” nit kreira skup podređenih (slave) niti i zadatak se distribuira između njih. Pretpostavlja se da se niti izvršavaju paralelno na mašini sa više procesora (broj procesora ne mora biti veći ili jednak broju niti).

Zadaci koje niti izvršavaju paralelno, kao i podaci potrebni za obavljanje ovih zadataka, opisani su pomoću posebnih predprocesorskih direktiva odgovarajućeg jezika - pragma. Na primjer, dijelu Fortran koda koji mora biti izvršen od nekoliko niti, od kojih svaka ima svoju kopiju varijable N, prethodi sljedeća direktiva: !$OMP PARALLEL PRIVATE(N)

Broj kreiranih niti može regulisati kako sam program pozivanjem bibliotečkih procedura, tako i eksterno, koristeći varijable okruženja.

Ključni elementi OpenMP-a su

1. konstrukcije za kreiranje niti (paralelna direktiva);

2. konstrukcije za distribuciju rada između niti (DO/for i section direktive);

3. konstrukcije za upravljanje radom s podacima (dijeljeni i privatni izrazi za definiranje memorijske klase varijabli);

4. konstrukcije za sinhronizaciju niti (kritičke, atomske i barijerske direktive);

5. Bibliotečke procedure podrške za vrijeme izvođenja (na primjer, omp_get_thread_num);

6. varijable okruženja (na primjer, OMP_NUM_THREADS).

OpenMP koristi model paralelnog izvršavanja sa spajanjem grana. OpenMP program počinje kao jedna nit izvršenja, koja se naziva početna nit. Kada nit naiđe na paralelnu konstrukciju, ona stvara novu grupu niti koja se sastoji od nje same i više dodatnih niti i postaje gospodar nove grupe. Svi članovi nove grupe (uključujući glavnu grupu) izvršavaju kod unutar paralelne konstrukcije. Na kraju paralelne strukture postoji implicitna barijera. Nakon paralelne konstrukcije, samo glavna nit nastavlja izvršavati korisnički kod. Paralelni region može biti ugniježđen sa drugim paralelnim regionima, u kojima svaka nit originalnog regiona postaje glavna nit za svoju grupu niti. Ugniježđene regije mogu zauzvrat uključiti regije na dubljem nivou ugniježđenja.

Broj niti u grupi koja se izvodi paralelno može se kontrolirati na nekoliko načina. Jedna od njih je upotreba varijabla okruženja OMP_NUM_THREADS. Drugi način je da pozovete proceduru omp_set_num_threads(). Drugi način je korištenje izraza num_threads u kombinaciji s paralelnom direktivom.

U ovom programu, dva niza (a i b) se dodaju paralelno sa deset niti.

#include

#include

int main(int argc, char *argv)

float a[N], b[N], c[N];

omp_set_dynamic(0); // spriječiti openmp biblioteku da promijeni broj niti tokom izvršavanja

omp_set_num_threads(10); // postavljamo broj niti na 10

// inicijalizira nizove

za (I = 0; I< N; i++)

// izračunati zbir nizova

#pragma omp paralelno podijeljeno (a, b, c) privatno (i)

za (I = 0; I< N; i++)

c[i] = a[i] + b[i];

printf("%f\n", c);

Ovaj program se može kompajlirati pomoću gcc-4.4 i novijih sa –fopenmp zastavicom. Očigledno, ako uklonite uključivanje datoteke zaglavlja omp.h, kao i pozive OpenMP konfiguracijske funkcije, program se može kompajlirati na bilo kojem C kompajleru kao običan sekvencijalni program.

OpenMP je podržan od strane mnogih modernih kompajlera:

1. Sun Studio kompajleri podržavaju zvaničnu specifikaciju - OpenMP 2.5 - sa poboljšanim performansama pod Solaris OS; Podrška za Linux predviđeno za sljedeće izdanje.

2. Visual C++ 2005 i novije verzije podržavaju OpenMP u Professional i Team System izdanjima.

3. GCC 4.2 podržava OpenMP, a neke distribucije (kao što je Fedora Core 5 gcc) imaju podršku u svojim verzijama GCC 4.1.

4. Intel C++ kompajler, uključujući verziju Intel Cluster OpenMP za programiranje u distribuiranim memorijskim sistemima.

Message Passing Interface (MPI Message passing interface) je programsko sučelje za prijenos informacija (API) koje omogućava razmjenu poruka između procesa koji obavljaju isti zadatak. Razvili su William Group, Evin Lusk i drugi.

MPI je najčešći standard interfejsa za razmenu podataka za paralelno programiranje, a postoje implementacije za veliki broj računarskih platformi. Koristi se u razvoju programa za klastere i superračunare. Glavno sredstvo komunikacije između procesa u MPI je prosljeđivanje poruka jedni drugima. MPI standardizaciju sprovodi MPI Forum. MPI standard opisuje interfejs za prosleđivanje poruka koji mora biti podržan i na platformi i u korisničkim aplikacijama. Trenutno postoji veliki broj besplatne i komercijalne MPI implementacije. Postoje implementacije za jezike Fortran 77/90, C i C++.

MPI je prvenstveno fokusiran na sisteme sa distribuiranom memorijom, odnosno kada su troškovi prenosa podataka visoki, dok je OpenMP fokusiran na sisteme sa deljenom memorijom (višejezgarni sa zajedničkim ESH). Obje tehnologije se mogu koristiti zajedno za optimalno korištenje višejezgrenih sistema u klasteru.

Prva verzija MPI je razvijena 1993-1994, a MPI 1 je objavljen 1994.

Većina modernih MPI implementacija podržava verziju 1.1. MPI verzija 2.0 standard podržava većina modernih implementacija, ali neke karakteristike možda neće biti u potpunosti implementirane.

slanje i primanje poruka između odvojenih procesa;

kolektivne interakcije procesa;

interakcije u procesnim grupama;

implementacija procesnih topologija;

generiranje dinamičkih procesa i upravljanje procesima;

jednosmjerne komunikacije (Get/Put);

paralelni ulaz i izlaz;

proširene kolektivne operacije (procesi mogu obavljati kolektivne operacije ne samo unutar jednog komunikatora, već i unutar nekoliko komunikatora).

Verzija MPI 2.1 objavljena je početkom septembra 2008.

Osnovni mehanizam komunikacije između MPI procesa je prijenos i prijem poruka. Poruka sadrži prenesene podatke i informacije koje omogućavaju primaocu da ih selektivno primi:

1. pošiljalac - rang (broj u grupi) pošiljaoca poruke;

2. primalac - rang primaoca;

3. znak - može se koristiti za razdvajanje razne vrste poruke;

4. komunikator - šifra procesne grupe.

Operacije prijema i prijenosa mogu biti blokirane ili neblokirajuće. Za neblokirajuće operacije definirane su funkcije za provjeru spremnosti i čekanje da se operacija završi.

Drugi način komunikacije je daljinski pristup memoriji (RMA), koji omogućava čitanje i modificiranje memorijskog područja udaljenog procesa. Lokalni proces može prenijeti područje memorije udaljenog procesa (unutar prozora koji su specificirali procesi) u njegovu memoriju i natrag, a također može kombinirati podatke prenesene udaljenom procesu s podacima dostupnim u njegovoj memoriji (na primjer, zbrajanjem ). Sve operacije daljinski pristup da memorija ne blokira, međutim, blokirajuće sinhronizacijske funkcije moraju biti pozvane prije i nakon njihovog izvršenja.

Ispod je primjer programa za izračunavanje π u C koristeći MPI:

// Povezivanje potrebnih zaglavlja

#include

#include

// Uključuje datoteku zaglavlja MPI

#include "mpi.h"

// Funkcija za međuproračune

duplo f (dvostruko a)

povratak (4,0 / (1,0+ a*a));

// Glavna funkcija programa

int main(int argc, char **argv)

// Deklariranje varijabli

int done = 0, n, myid, numprocs, I;

dupli PI25DT = 3,141592653589793238462643;

dupli mypi, pi, h, suma, x;

duplo startwtime = 0.0, endwtime;

char ime_procesora;

// Inicijaliziranje MPI podsistema

MPI_Init(&argc, &argv);

// Dobivamo veličinu komunikatora MPI_COMM_WORLD

// (ukupan broj procesa unutar zadatka)

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

// Dobivamo broj trenutnog procesa unutar

// komunikator MPI_COMM_WORLD

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPI_Get_processor_name(processor_name,&namelen);

// Prikaz broja niti u dijeljenom bazenu

fprintf(stdout, “Proces %d od %d je na %s\n”, myid,numprocs,processor_name);

// broj intervala

fprintf(stdout, “Unesite broj intervala: (0 prekida)”);

if(scanf(“%d”,&n) != 1)

fprintf(stdout, “Nije unet broj; napuštanje\n”);

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

h = 1,0 / (dvostruko)n;

// Izračunaj tačku koja je dodijeljena procesu

for(I = myid + 1; (I<= n) ; I += numprocs)

x = h * ((dvostruko)I – 0,5);

// Poništi rezultate svih procesa i dodaj

MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

// Ako je ovo glavni proces, ispiši rezultat

printf(“PI je približno %.16f, Greška je %.16f\n”, pi, fabs(pi – PI25DT));

endwtime = MPI_Wtime();

printf(“vrijeme na zidu = %f\n”, endwtime-startwtime);

// Otpuštanje MPI podsistema

Najčešći MPI implementacije danas su:

MPICH je najčešća besplatna implementacija, radi na UNIX sistemima i Windows NT

LAM/MPI je još jedna besplatna implementacija MPI. Podržava heterogene konfiguracije, LAM (http://www.lam-mpi.org) podržava heterogene konfiguracije, Globus paket i zadovoljava IMPI (Interoperabilni MPI).

Podržani su različiti komunikacioni sistemi (uključujući Myrinet).

WMPI - MPI implementacija za Windows

MPI/PRO za Windows NT - komercijalna implementacija za Windows NT

Intel MPI - komercijalna implementacija za Windows/Linux

Microsoft MPI je uključen u Compute Cluster Pack SDK. Zasnovano na MPICH2, ali uključuje dodatne mogućnosti upravljanja poslovima. Podržana je MPI-2 specifikacija.

HP-MPI - komercijalna implementacija od HP-a

SGI MPT - plaćena MPI biblioteka od SGI

Mvapich - besplatna MPI implementacija za Infiniband

Otvoreni MPI - besplatna implementacija MPI, nasljednik LAM/MPI

Oracle HPC ClusterTools - besplatna implementacija za Solaris SPARC/x86 i Linux baziran na Open MPI

MPJ - MPI za Javu

POSIX Threads- POSIX standard za implementaciju niti izvršavanja, definiranje API-ja za kreiranje i upravljanje njima.

Biblioteke koje implementiraju ovaj standard (i funkcije ovog standarda) se obično nazivaju Pthreads (funkcije imaju prefiks "pthread_"). Iako su najpoznatije opcije za operativne sisteme slične Unixu kao što su Linux ili Solaris, postoji i implementacija za Microsoft Windows (Pthreads-w32)

Pthreads definira skup tipova i funkcija u programskom jeziku C. Datoteka zaglavlja je pthread.h.

Tipovi podataka:

1. pthread_t – deskriptor niti;

2. pthread_attr_t – lista atributa niti.

Funkcije kontrole niti:

1. pthread_create() – kreiranje niti;

2. pthread_exit() – završetak niti (mora biti pozvan od strane funkcije niti nakon završetka);

3. pthread_cancel() – otkazati nit;

4. pthread_join() – blokira izvršavanje niti dok se druga nit navedena u pozivu funkcije ne završi;

5. pthread_detach() – oslobađanje resursa koje zauzima nit (ako je nit pokrenuta, resursi će biti oslobođeni nakon njenog završetka);

6. pthread_attr_init() – inicijalizira strukturu atributa niti;

7. pthread_attr_setdetachstate() – ukazuje sistemu da nakon što se nit završi, može automatski osloboditi resurse koje zauzima nit;

8. pthread_attr_destroy() – oslobodi memoriju iz strukture atributa niti (uništi deskriptor).

Funkcije sinhronizacije niti:

2. pthread_mutex_init(), pthread_mutex_destroy(), pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock();

3. pthread_cond_init(), pthread_cond_signal(), pthread_cond_wait().

Primjer korištenja niti u C:

#include

#include

#include

#include

statična void wait_thread(void)

time_t start_time = vrijeme(NULL);

dok (vrijeme(NULL) == vrijeme_početka)

/* ne radi ništa osim žvakanja CPU rezova do jedne sekunde. */

static void *thread_func(void *vptr_args)

za (I = 0; I< 20; i++)

fputs(“b\n”, stderr);

pthread_t thread;

if (pthread_create(&thread, NULL, thread_func, NULL) != 0)

return EXIT_FAILURE;

za (I = 0; I< 20; i++)

if (pthread_join(thread, NULL) != 0)

return EXIT_FAILURE;

return EXIT_SUCCESS;

Predstavljeni program koristi dvije niti koje ispisuju poruke na konzolu, jedna koja ispisuje "a", druga - "b". Izlaz poruke je pomiješan kao rezultat prebacivanja izvršenja između niti ili istovremenog izvršavanja na višeprocesorskim sistemima.

C program kreira jednu novu nit za štampanje "b", a glavna nit štampa "a". Glavna nit (nakon ispisa "aaaaa....") čeka da se podređena nit završi.

Sigurnosna pitanja

  1. Šta je paralelni program?
  2. Koja je razlika između procesa i niti izvršenja?
  3. Može li program kreirati 5 niti kada radi na četverojezgrenom procesoru?
  4. Koje su karakteristike paralelnih programa dijeljene memorije?
  5. Koji softverski alati postoje za razvoj paralelnih programa?
  6. Zašto je OpenMP postao široko rasprostranjen prilikom kreiranja programa za PC, a ne, na primjer, MPI?
programski proračuni na računaru treba nazvati paralelnim. Ali ovo nije jedino pitanje na koje želim da dobijem odgovor. Podjednako je važno razumjeti zašto trebate preći iz jednostavnog, poznatog, razumljivog svijeta sekvencijalnog računanja u svijet paralelnog računarstva koji je teško razumjeti. Koje su prednosti paralelnog računarstva, a koji problemi čekaju programera prilikom kreiranja programa orijentisanih na paralelno računarstvo. Da bismo odgovorili na ova pitanja, hajde da napravimo kratak izlet u istoriju razvoja računara.

Prvi računari su napravljeni prema principima koje je formulisao Von Neumann. Imali su tri glavne komponente – memoriju, procesor i određeni skup vanjskih uređaja koji obezbjeđuju unos i izlaz informacija.

Memorija je bila višeslojna i za prve računare je sadržavala eksternu memoriju i internu memoriju – operativnu i registarsku. Eksterna memorija (na magnetnim trakama, bušenim karticama, diskovima) omogućavala je čuvanje programa i podataka bez obzira da li je računar uključen ili ne. Interna memorija pohranjuje informacije samo za vrijeme trajanja računarske sesije. Kada je računar isključen, sadržaj interne memorije je nestao.

Da bi se program mogao izvršiti na računaru, morao je biti učitan u RAM. Tamo su pohranjeni na potpuno isti način kao i podaci koje je obradio ovaj program. Princip programa pohranjenog u memoriji jedan je od glavnih principa Von Neumannovih računara.

Memorija registara je korištena dok su se proračuni obavljali. Prije nego što se izvrši bilo kakva operacija nad podacima, podaci moraju biti dodijeljeni registrima. Ovaj najbrži tip memorije davao je potrebnu brzinu prilikom izvođenja operacija nad podacima.

Sve operacije - operacije nad podacima i operacije za kontrolu procesa proračuna - izvršio je procesor. Računarski procesor je imao specifičan skup komandi. Ovaj skup je bio dovoljno općenit da izračuna bilo koju potencijalno izračunljivu funkciju. S druge strane, ovaj set je osiguravao relativnu lakoću pisanja programa od strane ljudi.

Programi za prve računare predstavljali su niz naredbi uključenih u važeći skup komandi procesora. Izvršavanje programa na računaru bilo je prilično jednostavno. U svakom trenutku na računaru je bio pokrenut jedan program. Procesor je, u skladu sa programom, uzastopno izvršavao jednu instrukciju za drugom. Svi kompjuterski resursi - memorija, procesorsko vrijeme, svi uređaji - bili su na raspolaganju programu i ništa nije moglo ometati njegov rad (osim, naravno, osobe). Nije bilo ni traga paralelizmu.

Ova idila nije dugo trajala zbog neefikasnog korišćenja resursa kompjutera koji su u to vreme bili izuzetno skupi. Računari se tada nisu isključili – jedan program je zamijenio drugi.

Ubrzo, uz procesor, koji je postao poznat kao centralni procesor, računar je počeo da ima dodatne procesore, prvenstveno specijalizovane procesore za ulazno/izlazne uređaje, odgovorne za izvršavanje najsporijih komandi. To je omogućilo organizaciju grupnog načina izvršavanja programa, kada je nekoliko programa istovremeno radilo na računaru - jedan program je mogao da ispisuje rezultate rada, drugi može da se izvrši, treći može da unese podatke koji su mu potrebni, na primer sa magnetnu traku ili drugi vanjski medij.

Revolucionarni korak bilo je pojavljivanje 1964. IBM operativnog sistema - OS 360. Pojavljivanje na računaru operativni sistem postao njen suvereni gospodar - upravitelj svih njenih resursa. Sada je korisnički program mogao da se izvršava samo pod kontrolom operativnog sistema. operativni sistem omogućio je rješavanje dva važna problema – s jedne strane, pružanje potrebne usluge svim programima koji se istovremeno pokreću na računaru, s druge strane, efikasno korištenje i distribuciju postojećih resursa između programa koji traže ove resurse. Pojava operativnih sistema dovela je do prelaska sa jednoprogramskog načina rada na višeprogramski način rada, kada se više programa istovremeno izvršava na jednom računaru. Multiprogramiranje još nije paralelno programiranje, ali to je korak u pravcu paralelnog računanja.

Multiprogramiranje je paralelno izvršavanje nekoliko programa. Multiprogramiranje vam omogućava da smanjite ukupno vrijeme izvršenja.

Paralelno računanje se odnosi na paralelno izvršavanje istog programa. Paralelno računanje vam omogućava da smanjite vrijeme izvršavanja jednog programa.

Imajte na umu da je prisustvo nekoliko procesora na računaru neophodan uslov za multiprogramiranje. Za implementaciju multiprogramiranja dovoljno je postojanje operativnog sistema koji organizuje međusobni rad procesora. Za paralelno računanje nameće se dodatni zahtjev - ovo je zahtjev za sam program - program mora omogućiti mogućnost paraleliziranja proračuna.

Pojava operativnog sistema značila je da se računar ne može posmatrati samo kao hardver (memorija, procesori, drugi uređaji). Sada ima dvije komponente – tvrdu i meku – hardverske i softverske komponente koje se međusobno nadopunjuju. Tokom pola veka postojanja računara, obe komponente su brzo evoluirale.

Opremu karakteriše eksponencijalni rast, koji se ogleda u poznatom empirijskom Mooreovom zakonu - sve najvažnije karakteristike su rasle eksponencijalno - zapremina memorije na svim nivoima, smanjenje vremena pristupa memoriji, brzina procesora. Prema Mooreovom zakonu (Gordon Moore je jedan od osnivača Intela), svake godine i po vrijednosti karakteristika su se udvostručile. Porastao je i broj procesora uključenih u računar. Promijenjen i arhitektura računara. Ove promjene su u velikoj mjeri bili koraci ka paralelizaciji proračuna. Evo samo nekoliko promjena u arhitekturi procesora direktno povezanih s procesom paralelizacije:

  • Obrada naredbi cjevovoda. Proces izvršavanja niza naredbi od strane procesora se više nije smatrao uzastopnim izvršavanjem naredbe za komandom. Tok komandi je obrađen na cjevovodu, tako da je nekoliko komandi pripremljeno za izvršenje odjednom. Sa obradom cevovoda, komande koje nisu bile povezane jedna s drugom podacima mogu se izvršavati istovremeno, što je pravi paralelizam.
  • "Duge komande" Arhitektura nekih računara uključivala je nekoliko procesora koji su dozvoljavali logičke i aritmetičke operacije nad celim brojevima i nekoliko procesora koji su obavljali operacije nad brojevima s pokretnim zarezom. Duga komanda vam je omogućila da u jednoj komandi navedete akcije koje svaki od postojećih procesora treba da izvrši. Opet, ovo je omogućilo implementaciju paralelizma na hardverskom nivou.
  • Vektorski i matrični procesori. Skup instrukcija takvih procesora uključuje osnovne operacije nad vektorima i matricama. S jednom komandom, na primjer, možete dodati dvije matrice. Ova komanda zapravo implementira paralelno računanje. Široko su rasprostranjene aplikacije u kojima ove operacije čine osnovu obrade podataka. Paralelna obrada podataka zasnovana na hardveru može značajno povećati efikasnost aplikacija ove klase.
  • Grafički procesori. Još jedan važan tip aplikacija gdje se paralelno izvršavanje događa na hardverskom nivou su grafički intenzivne aplikacije. Ovu obradu obavljaju GPU-ovi. Grafička slika se može zamisliti kao zbirka tačaka. Obrada slike se često svodi na izvođenje iste operacije na svim tačkama. Paralelizacija podataka se lako implementira u takvoj situaciji. Stoga su GPU-ovi odavno višejezgarni, što omogućava paralelnu obradu i efikasnu obradu slike.
  • Superkompjuteri. Superračunari su računari sa najvišim performansama u ovom trenutku. Sastoje se od stotina hiljada procesora. Efikasna upotreba superkompjutera zahteva najširu moguću paralelizaciju proračuna.

U naučnim istraživanjima i novim tehnologijama uvijek postoje problemi koji zahtijevaju punu snagu postojećih računarskih sistema. Naučni potencijal jedne zemlje je u velikoj mjeri određen postojanjem njenih superkompjutera. Koncept superkompjutera je relativan koncept. Karakteristike superkompjutera od prije deset godina danas odgovaraju karakteristikama običnog kompjutera. Današnji superračunari imaju performanse, mjereno u petaflopsima (10 15 operacija s pomičnim zarezom u sekundi). Do 2020. to se očekuje performanse superračunari će se povećati za 1000 puta i mjerit će se u exaflopsima.

Klasifikacija računara

Svijet kompjutera je raznolik, u rasponu od minijaturnih ugrađenih kompjutera do višetonskih superkompjutera koji zauzimaju zasebne zgrade. Mogu se klasifikovati na različite načine. Razmotrimo jednu od prvih i najjednostavnijih klasifikacija - Flynnovu klasifikaciju, zasnovanu na tome kako je obrada podataka organizirana u kompjuteru. Prema ovoj klasifikaciji, svi računari (računarski sistemi) se mogu podeliti u četiri klase - računare sa sledećom arhitekturom:

  • SISD (Single Instruction stream - Single Data stream) - jedan tok naredbi - jedan tok podataka. Ova klasa uključuje obične “serijske” računare sa von Neumannovom arhitekturom, kada se programske komande izvršavaju sekvencijalno, obrađujući sljedeći element podataka.
  • SIMD (Single Instruction stream - Multiple Data stream) - tok jedne komande - višestruki tok podataka. Ovaj tip uključuje računare sa vektorskim i matričnim procesorima.
  • MISD (Multiple Instruction stream - Single Data stream) - višestruki tok komandi - jedan tok podataka. Ova vrsta uključuje računare sa transportnim tipom obrade podataka. Međutim, mnogi smatraju da takve računare treba klasifikovati kao prvi tip, a računari klase MISD još nisu stvoreni.
  • MIMD (Multiple Instruction stream - Multiple Data stream) - višestruki tok komandi - višestruki tok podataka. MIMD klasa je izuzetno široka i trenutno uključuje mnogo računara prilično različitih arhitektura. Stoga se predlažu druge klasifikacije za precizniju klasifikaciju računara uključenih u MIMD klasu.

Nećemo razmatrati detaljnu klasifikaciju računara MIMD klase. Zaustavimo se samo na još jednom načinu podjele računara u tri klase:

  • Višeprocesorski računarski sistemi su računari sa više procesora koji rade na zajedničkoj memoriji. Ova klasa uključuje većinu višejezgrenih računara koji se danas prodaju na tržištu.
  • Višeračunarski računarski sistemi - predstavljaju mnogo računara povezanih brzim komunikacionim linijama. Svaki računar ima svoju memoriju i razmenjuje poruke sa drugim računarima u sistemu radi prenosa podataka. Ova klasa uključuje klastere. Klaster je računarski kompleks koji se smatra jedinstvenom celinom, sa namenskim računarom koji igra ulogu servera. Pošto računari koji čine klaster mogu biti obični računari, klasteri su relativno jeftini. Većina top 500 superračunara su klasteri.
  • Hibridni računarski sistemi - sastoje se od mnogo čvorova, od kojih svaki može biti multiračunarski, multiprocesorski, grafički ili vektorski procesor. Takvi kompleksi su, po pravilu, superračunari.

Koncept paralelnog računarstva

OSNOVE PARALELNOG RAČUNARA

Predavanje br. 6


Ispod paralelna ili istovremena računanja možete razumjeti procese rješavanja problema u kojima se nekoliko računskih operacija može izvoditi istovremeno

Paralelno računarstvo čini osnovu superkompjuterskih tehnologija i računarstva visokih performansi

Paralelna obrada

Ako određeni uređaj izvrši jednu operaciju u jedinici vremena, tada će izvršiti hiljadu operacija u hiljadu jedinica. Ako pretpostavimo da postoji pet identičnih nezavisnih uređaja sposobnih da rade istovremeno, onda sistem od pet uređaja može izvršiti istih hiljadu operacija ne u hiljadu, već u dvije stotine jedinica vremena.

Slično, sistem od N uređaja će obaviti isti posao u 1000/N jedinica vremena. Slične analogije se mogu naći i u životu: ako jedan vojnik iskopa baštu za 10 sati, onda će se četa od pedeset vojnika sa istim sposobnostima, koji rade istovremeno, nositi s istim poslom za 12 minuta - princip paralelizma u akciji!

Pionir u paralelnoj obradi tokova podataka bio je akademik A.A. Samarsky, koji je izveo proračune potrebne za simulaciju nuklearnih eksplozija ranih 50-ih. Samarsky je rešio ovaj problem tako što je nekoliko desetina mladih dama sa mašinama za sabiranje postavio za stolove. Mlade dame su prenosile podatke jedna drugoj jednostavno riječima i unosile potrebne brojeve na mašine za sabiranje. Tako je posebno izračunata evolucija eksplozijskog vala.

Bilo je puno posla, mlade dame su bile umorne, a Aleksandar Andrejevič je hodao među njima i hrabrio ih. Ovo je, moglo bi se reći, bio prvi paralelni sistem. Iako su proračuni za hidrogensku bombu izvedeni maestralno, njihova preciznost je bila vrlo mala, jer je bilo malo korištenih čvorova u mreži, a vrijeme proračuna je bilo predugo.

Obrada transporterom

Ideja cjevovodne obrade je da se izoluju pojedinačne faze izvođenja opće operacije, a svaka faza, nakon što završi svoj posao, prenijela bi rezultat na sljedeću, dok bi istovremeno primala novi dio ulaznih podataka. Dobijamo očigledan dobitak u brzini obrade kombinovanjem prethodno raspoređenih operacija.

Pretpostavimo da u jednoj operaciji postoji pet mikrooperacija, od kojih se svaka izvodi u jednoj jedinici vremena. Ako postoji jedan nedjeljiv serijski uređaj, tada će obraditi 100 parova argumenata u 500 jedinica. Ako se svaka mikrooperacija razdvoji u zasebnu fazu (ili drugačije nazvanu faza) transportnog uređaja, tada će se u petoj jedinici vremena, u različitim fazama obrade takvog uređaja, nalaziti prvih pet parova argumenata , a cijeli set od sto parova bit će obrađen za 5 + 99 = 104 jedinice vremena - ubrzanje u odnosu na serijski uređaj je skoro pet puta (prema broju faza transportera).



Modeli paralelnih računara (Flynn klasifikacija)

· “Jedan tok komandi - jedan tok podataka” (SISD - “Jedinstveni instrukcijski pojedinačni podaci”)

Odnosi se na von Neumann arhitekturu. SISD računari su obični, “tradicionalni” sekvencijalni računari, u kojima se samo jedna operacija izvodi na jednom elementu podataka (numeričkom ili nekoj drugoj vrijednosti) u bilo kojem trenutku. Većina modernih personalnih računara spada u ovu kategoriju.

· "Jedan tok komandi - mnogo tokova podataka" (SIMD - "Jedna instrukcija - više podataka")

SIMD (jedna instrukcija, više podataka)- princip kompjuterskog računarstva koji omogućava paralelizam na nivou podataka. SIMD računari se sastoje od jednog komandnog procesora (kontrolnog modula), koji se naziva kontroler, i nekoliko modula za obradu podataka, koji se nazivaju elementi za obradu. Upravljački modul prima, analizira i izvršava komande.

Ako se u naredbi nađu podaci, kontroler šalje naredbu svim elementima procesora, a ova naredba se izvršava na nekoliko ili na svim elementima procesora. Svaki procesni element ima svoju memoriju za pohranjivanje podataka. Jedna od prednosti ove arhitekture je što se u ovom slučaju logika proračuna implementira efikasnije. SIMD procesori se takođe nazivaju vektorskim procesorima.

· „Mnogo tokova komandi – jedan tok podataka“ (MISD – „Višestruke instrukcije – pojedinačni podaci“)

Računara ove klase praktično nema i teško je dati primjer njihove uspješne implementacije. Jedan od rijetkih je sistolni niz procesora, u kojem su procesori smješteni na čvorovima regularne rešetke, čije ivice imaju međuprocesorske veze. Svim elementima procesora upravlja zajednički generator takta. U svakom radnom ciklusu, svaki element obrade prima podatke od svojih susjeda, izvršava jednu naredbu i prenosi rezultat svojim susjedima.

Pozivaju se nizovi PE-ova sa direktnim vezama između obližnjih PE-ova sistolni. Takvi nizovi su izuzetno efikasni, ali je svaki od njih fokusiran na rješavanje vrlo uske klase problema. Razmotrimo kako možete izgraditi sistolički niz za rješavanje određenog problema. Neka, na primjer, želite da kreirate uređaj za izračunavanje matrice D=C+AB, Gdje

Ovdje su sve matrice trakaste matrice reda n. Matrix A ima jednu dijagonalu iznad i dvije dijagonale ispod glavne; matrica B- jedna dijagonala ispod i dvije dijagonale iznad glavne; matrica C tri dijagonale iznad i ispod glavne. Neka svaki PE može izvesti skalarnu operaciju c+ab i istovremeno prenose podatke. Svaki PE, dakle, mora imati tri ulaza: a, b, c i tri izlaza: a, b, c. Unos ( in) i vikendom ( van) podaci su povezani relacijama

a out = a in , b out = b in , c out = c in + a in *b in ;

Ako u vrijeme operacije neki podaci nisu primljeni, onda ćemo pretpostaviti da su definirani kao nule. Pretpostavimo dalje da se svi PE nalaze u ravni i svaki od njih je povezan sa šest susjednih. Ako rasporedite podatke kao što je prikazano na slici, kolo će izračunati matricu D.

Niz radi u taktnim ciklusima. Tokom svakog ciklusa takta, svi podaci se premeštaju u susedne čvorove u smerovima označenim strelicama.

Slika prikazuje stanje sistoličkog niza u nekom trenutku. U sljedećem ciklusu takta, svi podaci će se premjestiti na jedan čvor i elemente a11, b11, c11će završiti u jednom PE koji se nalazi na raskrsnici isprekidanih linija. Stoga će izraz biti evaluiran c11+a11b11.U istom satu, podaci a12 I b21 doći će vrlo blizu PE, koji se nalazi na vrhu sistoličkog niza.

U sljedećem ciklusu takta, svi podaci će se ponovo pomjeriti za jedan čvor u smjeru strelica i pojavit će se u gornjem PE a12 I b21 i rezultat prethodnog rada PE koji se nalazi ispod, tj. c11+a11b11. Stoga će izraz biti evaluiran c11+a11b11+a12b21. Ovo je element d11 matrice D.

Nastavljajući korak po korak ispitivanje procesa, možemo potvrditi da se na PE izlazima koji odgovaraju gornjoj granici sistoličkog niza, elementi matrice periodično izlaze nakon tri koraka D, dok se na svakom izlazu pojavljuju elementi iste dijagonale. In about 3n ciklusa, izračunavanje cijele matrice će biti završeno D. U ovom slučaju, opterećenje svake sistoličke ćelije je asimptotski jednako 1/3 .

"Mnogo tokova komandi - mnogo tokova podataka" (MIMD - "Višestruke instrukcije - više podataka")

Ova kategorija računarskih arhitektura je najbogatija ako imajte na umu primjere njegove uspješne implementacije. Uključuje simetrične paralelni računarski sistemi, radne stanice sa više procesori, klasteri radnih stanica itd.

Ogromne performanse paralelnih računara i superkompjutera više su nego nadoknađene teškoćama njihovog korišćenja. Počnimo s najjednostavnijim stvarima. Imate program i pristup, recimo, računaru sa 256 procesora. Šta očekuješ? Da, jasno je: sasvim opravdano očekujete da će se program izvršavati 256 puta brže nego na jednom procesoru. Ali to je ono što se najvjerovatnije neće dogoditi.

Slanje vašeg dobrog rada u bazu znanja je jednostavno. Koristite obrazac ispod

Studenti, postdiplomci, mladi naučnici koji koriste bazu znanja u svom studiranju i radu biće vam veoma zahvalni.

Objavljeno na http://www.allbest.ru/

Objavljeno na http://www.allbest.ru/

  • Uvod
  • 1. Relevantnost teme
  • 2. Povećanje broja jezgara
  • 3. NVIDIA CUDA tehnologija
  • 4. Razlika između CPU-a i GPU-a
  • Zaključak
  • Uvod
  • Paralelizacija proračuna je podjela velikih zadataka na manje koji se mogu izvoditi istovremeno. Obično, paralelno računanje zahtijeva određene koordinirane napore. Paralelno računanje dolazi u nekoliko oblika (instrukcije, bitovi, podaci, nivoi zadataka). Paralelno računarstvo se već dugi niz godina koristi uglavnom u računarstvu visokih performansi. Ali situacija se nedavno promijenila. Postojala je potražnja za ovakvim proračunima zbog fizičkih ograničenja na rast brzine procesorskog takta. Paralelno računarstvo je postalo dominantna ideja u arhitekturi računara. Imao je oblik višejezgrenih procesora.
  • Upotreba paralelnih računarskih sistema određena je strateškim pravcima razvoja računarske industrije. Glavna okolnost nije bila samo ograničenje brzine mašina zasnovano na sekvencijalnoj logici, već i prisustvo zadataka za koje dostupnost kompjuterske tehnologije još nije dovoljna. Zadaci u ovoj kategoriji uključuju modeliranje dinamičkih procesa.
  • Pojava procesora sa više jezgara označila je iskorak u razvoju efikasnog superkompjutera, koji se može pohvaliti višim omjerom performansi i troškova od sistema baziranih na superkompjuterima. Upotreba višejezgrenih procesora pruža fleksibilnost, posebno za različite konfiguracije, kao i skaliranje snage u računarskim sistemima - od računara, servera, radnih stanica pa do klaster sistema.
  • 1. Relevantnost teme
  • Poslednjih godina pojavio se veliki broj jeftinih klaster paralelnih računarskih sistema, što je dovelo do brzog razvoja paralelnih računarskih tehnologija, uključujući i oblast računarstva visokih performansi. Većina velikih proizvođača mikroprocesora počela je prelaziti na višejezgrene arhitekture, što je uticalo na promjenu situacije u oblasti paralelnih računarskih tehnologija. Promjena hardverske baze povlači promjenu u konstrukciji paralelnih algoritama. Za implementaciju u višejezgarnim računarskim arhitekturama, potrebni su novi paralelni algoritmi koji uzimaju u obzir nove tehnologije. Efikasnost korišćenja računarskih resursa zavisiće od kvaliteta samih paralelnih aplikacija i specijalizovanih biblioteka usmerenih na višejezgrene arhitekture.
  • Upotreba tehnologije visokih performansi u modeliranju realnih tehničkih, ekonomskih i drugih procesa opisanih sistemima visokodimenzionalnih običnih diferencijalnih jednačina nije samo opravdana, već i neophodna. Paralelizacija proračuna u višeprocesorskim i paralelnim strukturama je efikasan način za poboljšanje performansi. Dakle, upotreba paralelnih računarskih sistema je prilično važan pravac u razvoju računarske tehnologije.

2. Povećanje broja jezgara

Prvi procesor za masovnu upotrebu bio je POWER4 sa dva PowerPC jezgra na jednom čipu. Izdao IBM 2001.

Proizvođači procesora Intel, AMD, IBM, ARM prepoznali su povećanje broja jezgara kao jedno od prioritetnih područja za povećanje performansi.

U 2011. objavljeni su 8-jezgarni procesori za kućne računare i 16-jezgarni za serverske sisteme.

Postoje razvoji procesora sa velikim brojem jezgara (više od 20), koji su našli primenu u određenim uređajima.

Dvojezgarni procesori su postojali ranije, na primjer IBM PowerPC-970MP (G5H). Ali takvi procesori su korišteni u uskom rasponu specijaliziranih zadataka.

U aprilu 2005. AMD je predstavio 2-jezgreni Opteron procesor. AMD64 arhitektura. dizajniran za servere. U maju 2005. Intel je predstavio procesor Pentium D x86-64. Postao je prvi 2-jezgarni procesor za kućne računare.

U martu 2010. AMD je predstavio 12-jezgrene serijske serverske procesore Opteron 6100 (x86/x86-64 arhitektura).

U avgustu 2011. godine, AMD je predstavio 16-jezgrene serverske procesore Opteron 6200. Interlagos procesor sadrži dva 8-jezgrena (4-modulna) čipa u jednom paketu i kompatibilan je sa platformom serije AMD Opteron 6100 (Socket G34).

3. NVIDIA CUDA tehnologija

Velika količina paralelnog računarstva povezana je sa 3D igrama. Paralelno vektorsko računanje na uređajima opšte namene sa višejezgarnim procesorima koristi se u 3D grafici, postižući visoke vršne performanse. Univerzalni procesori to ne mogu učiniti. Maksimalna brzina se postiže samo u nizu praktičnih zadataka, uz određena ograničenja. Ali ipak, takvi se uređaji naširoko koriste u područjima gdje nisu prvobitno bili namijenjeni. Na primjer, Cell procesor, koji je razvila alijansa Sony-Toshiba-IBM u igraćoj konzoli Sony PlayStation 3, ili moderne video kartice iz NVIDIA-e i AMD-a.

Prije nekoliko godina počele su se pojavljivati ​​negrafičke računarske tehnologije opće namjene GPGPU za 3D video akceleratore. Moderni video čipovi imaju stotine matematičkih izvršnih jedinica, takva snaga može značajno ubrzati mnoge računarski intenzivne aplikacije. Trenutne generacije GPU-a imaju fleksibilnu arhitekturu, koja, zajedno sa softverskom i hardverskom arhitekturom i jezicima visokog nivoa, omogućava da ih učine mnogo pristupačnijim.

Pojava prilično brzih i fleksibilnih shader programa zainteresovala je programere za stvaranje GPGPU-a koji su sposobni da izvršavaju moderne video čipove. Programeri su želeli da koriste GPU za izračunavanje ne samo slika u igrama i 3D aplikacijama, već i da ih koriste u drugim oblastima paralelnog računarstva. Da bismo to učinili, koristili smo API OpenGL i Direct3D grafičkih biblioteka. Podaci su prenošeni na video čip kao teksture, a računski programi su postavljeni u obliku shadera. Glavni nedostatak ove metode je značajna složenost programiranja, niska razmjena podataka između GPU-a i CPU-a i neka druga ograničenja.

Vodeći proizvođači video čipova NVIDIA i AMD predstavili su platforme za paralelno računarstvo - CUDA i CTM, respektivno. Video kartice sada imaju hardversku podršku za direktan pristup računarskim resursima. CUDA je proširenje programskog jezika C CTM je više kao virtuelna mašina koja izvršava samo asemblerski kod. Obje platforme su uklonile ograničenja prethodnih verzija GPGPU-a, koje su koristile tradicionalni grafički cevovod, i naravno Direct3D i Open GL grafičke biblioteke.

OpenGL je prenosiviji i svestran zbog svoje prirode otvorenog koda. Ali neće dopustiti da se isti kod koristi na čipovima različitih proizvođača. Takve metode imaju mnoge nedostatke, nisu zgodne i imaju malu fleksibilnost. Takođe vam ne dozvoljavaju da koristite specifične mogućnosti nekih video kartica, na primer, brzu zajedničku memoriju.

Upravo to se dogodilo NVIDIA-i da objavi CUDA platformu - programski jezik sličan C, opremljen vlastitim kompajlerom, a također ima biblioteke za GPU računarstvo. Pisanje dobrog koda za video čipove nije lako, ali CUDA vam daje veću kontrolu nad hardverom video kartice. CUDA se pojavila sa video karticama serije 8. Pojavila se CUDA verzija 2.0, koja podržava proračune dvostruke preciznosti u 32- i 64-bitnom Windowsu, Linuxu, MacOS-u.

4. Razlika između CPU-a i GPU-a

Povećanje brzine takta je prekinuto zbog velike potrošnje energije. Do povećanja performansi dolazi zbog povećanja broja jezgara na jednom čipu. Trenutno se za kućne korisnike prodaju procesori sa do osam jezgara i nizom do 16. U takvim procesorima svako jezgro radi zasebno.

Posebne vektorske mogućnosti (SSE instrukcije) za 4-komponentne (jednostruke preciznosti s pomičnim zarezom) i 2-komponentne (dvostruke preciznosti) vektore pojavile su se u procesorima opšte namjene zbog visokih zahtjeva grafičkih aplikacija. Stoga je korištenje GPU-a isplativije, jer Prvobitno su dizajnirani za takve zadatke.

Kod NVIDIA čipova, glavna jedinica je multiprocesor sa 8-10 jezgara i stotinak ALU sa nekoliko hiljada registara i velikom zajedničkom memorijom. Video kartica ima globalnu memoriju dostupnom iz svih multiprocesora, lokalnu memoriju u svakom multiprocesoru, a ima i memoriju za konstante.

U GPU-ovima, jezgra su SIMD (single istruction stream, multiple data stream) jezgre. Ove jezgre izvršavaju iste instrukcije u isto vrijeme. Ovo je stil programiranja grafičkih algoritama. Specifičan je, ali vam omogućava da povećate broj računskih jedinica zbog svoje jednostavnosti.

Glavne razlike između arhitektura (GPU i CPU): CPU jezgra izvršavaju jednu nit sekvencijalnih instrukcija sa maksimalnim performansama, GPU izvršava veliki broj paralelnih niti instrukcija. Procesori opšte namene imaju za cilj postizanje visokih performansi jedne niti instrukcije, obradu brojeva sa i bez pomičnog zareza. Pristup memoriji je nasumičan.

Politika CPU programera je da se više instrukcija izvršava paralelno kako bi se povećale performanse. Stoga se, počevši od Intel Pentium procesora, pojavila superskalarna tehnologija izvršenja, koja predstavlja izvršenje 2 instrukcije po taktu, a Pentium Pro procesor se odlikovao neredovnim izvršavanjem instrukcija.

Video čipovi imaju jednostavniji rad i paralelni su od samog početka. Čip preuzima grupu poligona, sve potrebne operacije i proizvodi piksele. Poligoni i pikseli se obrađuju nezavisno jedan od drugog. Zato GPU ima tako veliki broj procesora. Takođe, moderni GPU-ovi su sposobni da izvrše više od jedne instrukcije po taktu.

Još jedna razlika između CPU-a i GPU-a: princip pristupa memoriji. U GPU-u je koherentan i predvidljiv, jer ako su teksture prebrojane, to znači da će nakon nekog vremena doći na red susjedne teksture. Stoga je organizacija memorije video kartice i centralnog procesora različita. I iz tog razloga, video čipu nije potrebna velika keš memorija, a teksture zahtijevaju samo oko 128-256 kB.

Rad sa memorijom je takođe drugačiji. CPU-i imaju ugrađene memorijske kontrolere, GPU-ovi obično imaju nekoliko njih, do osam 64-bitnih kanala. Osim toga, koristi se vrlo brza memorija, pa je propusni opseg memorije veći, što je plus za paralelna izračunavanja koja rade sa ogromnim tokovima podataka.

U CPU-u se veliki broj tranzistora troši na bafere komandi, predviđanje grananja hardvera i ogromne količine keš memorije. Svi ovi blokovi su potrebni za ubrzavanje nekoliko komandnih tokova. U GPU-ovima, tranzistori idu u nizove izvršnih jedinica, male zajedničke memorije, jedinice za kontrolu protoka i memorijske kontrolere. Sve to ne ubrzava izvršavanje pojedinačnih niti, ali vam omogućava da istovremeno obrađujete veliki broj njih.

Keširanje. CPU koristi keš memoriju da smanji kašnjenje pristupa memoriji, što rezultira povećanjem performansi. GPU koristi keš memoriju za povećanje propusnosti. CPU smanjuje kašnjenje pristupa memoriji kroz veliku keš memoriju i predviđanje grananja koda. Ovi dijelovi hardvera su veliki na čipu, stoga troše mnogo energije. GPU-ovi rješavaju problem kašnjenja pristupa memoriji na drugi način: izvršavaju hiljade niti istovremeno. Kada jedna nit čeka podatke, druga nit izvodi proračune bez čekanja ili odlaganja.

Općenito, možemo izvući sljedeći zaključak: video čipovi su dizajnirani za paralelna izračunavanja s velikom količinom podataka i velikim brojem aritmetičkih operacija.

5. Prva upotreba proračuna na grafičkim akceleratorima

Istorija korišćenja čipova za matematičke proračune počela je davno. Prvi pokušaji su bili primitivni i koristili su neke funkcije iz Z-baferiranja i rasterizacije. Ali s pojavom shadera, počelo je ubrzanje. Godine 2003 SIGGRAPH ima novu sekciju za računarstvo, a dobio je i GPGPU.

BrookGPU. Poznati kompajler programskog jezika Brook. Je streaming. Posebno je dizajniran za GPU računarstvo. Programeri su koristili API: Direct3D ili OpenGL. Ovo je značajno ograničilo upotrebu GPU-a, jer shaderi i teksture su korišteni u 3D grafici, a stručnjaci za paralelno programiranje ne moraju ništa znati. Oni koriste trenutne niti i jezgre. Brook je mogao malo pomoći u ovom zadatku. Proširenja za jezik C pomogla su da se 3D API sakrije od programera i obezbijedi video čip kao paralelni koprocesor. Kompajler je kompajlirao kod i povezao ga sa DirectX, OpenGL ili x86 bibliotekom.

6. Područja primjene paralelnih proračuna na grafičkim akceleratorima

Ovo su prosječne brojke za povećanje performansi računara koje su dobili istraživači širom svijeta. Prilikom prelaska na GPU, povećanje performansi je u prosjeku 5-30 puta, au nekim primjerima dostiže i do 100 puta (obično je to kod koji nije pogodan za proračune koristeći SEE.

Evo nekoliko primjera ubrzanja:

· Fluorescentna mikroskopija - 12 puta;

· Molekularna dinamika - 8-16 puta;

· Elektrostatika (direktna i višestepena Kulonova sumacija) - 40-120 puta i 7 puta.

grafika jezgra procesora

Zaključak

Ukratko, bili smo u mogućnosti da razmotrimo paralelno računarstvo na višejezgarnim procesorima, kao i CUDA i CTM tehnologije. Razmatrana je razlika između CPU-a i GPU-a, koje su poteškoće pri korištenju video kartica u paralelnom računarstvu bez CUDA tehnologije, te su razmotrena područja primjene.

U sažetku nije razmatrana upotreba paralelnog računarstva u centralnim procesorima sa integrisanim video jezgrom. Radi se o procesorima AMD A serije (AMD A10, AMD A8, AMD A6, AMD A4) i procesorima Intel i3/i5/i7 serije sa ugrađenim HD Graphics video jezgrom.

Spisak korišćene literature

1. Web stranica ixbt.com, vlasnik Byrds Research and Publishing, Ltd

2. Web stranica wikipedia.org, vlasnik Wikimedia Foundation

3. Web stranica nvidia.ru, vlasnik NVIDIA korporacije

Objavljeno na Allbest.ru

...

Slični dokumenti

    Batch metoda kao glavna metoda izvođenja komunikacijskih operacija, njen sadržaj i zahtjevi. Procjena složenosti operacije prijenosa podataka između dva čvora klastera. Faze razvoja paralelnih algoritama (paralelizacija).

    prezentacija, dodano 02.10.2014

    Uvod u istoriju razvoja višeprocesorskih sistema i paralelnog računarstva. Personalni računari kao uobičajeni jednoprocesorski sistemi na Intel ili AMD platformi sa operativnim sistemima za jednog korisnika.

    prezentacija, dodano 22.02.2016

    Klasifikacija paralelnih računarskih sistema. Osnovni pojmovi i komponente paralelnih računara, njihove komponente. Karakteristike klasifikacija Hendera, Hockneyja, Flynna, Shorea. Sistemi sa zajedničkom i lokalnom memorijom. Metode podjele memorije.

    kurs, dodan 18.07.2012

    Matematičke osnove paralelnog računanja. Svojstva Parallel Computing Toolbox. Razvoj paralelnih aplikacija u Matlabu. Primjeri programiranja paralelnih zadataka. Izračunavanje određenog integrala. Serijsko i paralelno množenje.

    kurs, dodan 15.12.2010

    Razvoj koncepta i mogućnosti OS-a. Paralelni računarski sistemi i karakteristike njihovih OS. Simetrični i asimetrični višeprocesorski sistemi. Vrste servera u klijent-server sistemima. OS za cloud computing. Klaster računarski sistemi.

    predavanje, dodano 24.01.2014

    Tehnologija za razvoj paralelnih programa za višeprocesorske računarske sisteme sa zajedničkom memorijom. Sintaksa, semantika i struktura OpenMP modela: direktive, procedure i varijable okruženja. Paralelizacija podataka i operacija, sinhronizacija.

    prezentacija, dodano 02.10.2014

    Paralelni računarski sistemi, njihove opšte karakteristike i funkcionalne karakteristike, procena mogućnosti, unutrašnja struktura i međusobna povezanost elemenata, vrste: jednoprocesorski i višeprocesorski. Paralelni oblik algoritma, njegova reprezentacija i implementacija.

    test, dodano 02.06.2014

    Prednosti višeprocesorskih sistema. Kreiranje programa koji implementira rad višeprocesorskog sistema sa zajedničkom memorijom za obradu različitog broja zahtjeva, kao i različitog broja procesora. Modeli proračuna na vektorskim i matričnim računarima.

    kurs, dodato 21.06.2013

    Apstraktni modeli i metode paralelne obrade podataka, dozvoljena greška proračuna. Koncept paralelnog procesa, njihove granule sinhronizacije i paralelizacije, definicija Amdahlovog zakona. Arhitektura višeprocesorskih računarskih sistema.

    teza, dodana 09.09.2010

    Jednoprocesorski računarski sistemi ne mogu da se nose sa rešavanjem vojnih primenjenih problema u realnom vremenu, stoga se za povećanje performansi vojnih računarskih sistema koriste višeprocesorski računarski sistemi (MCS).

Višeprocesiranje i više jezgara odavno su postali uobičajeni među korisnicima, što ne sprječava programere da ne u potpunosti, ili čak jednostavno pogrešno koriste mogućnosti koje su im svojstvene. Ne obećavamo da ćete nakon čitanja ovog članka postati guru paralelnog računarstva u Win okruženju, ali ćete sigurno razumjeti neke stvari.

Uvod

Bližio se kraj ere 32-bitnih kamenova i bilo je očigledno da je potrebno povećati ne samo snagu, već i kapacitet bita. Programeri procesora suočili su se s brojnim problemima u povećanju frekvencije takta: bilo je nemoguće raspršiti toplinu koju je generirao kristal, bilo je nemoguće dalje smanjiti veličinu tranzistora, ali glavni problem je bio što povećanje frekvencije takta nije poboljšalo performanse programa. Razlog tome je paralelni rad savremenih kompjuterskih sistema, a jedan procesor, ma koliko moćan bio, može obavljati samo jedan po jedan zadatak. Na primjer, imam 119 procesa pokrenutih na mom Windows 7 sistemu u vrijeme pisanja ovog teksta. Iako nisu svi u pozadini, nije im svima potrebna velika snaga. Na jednom kamenu, izvršavanje nekoliko procesa/niti može biti samo istovremeno. Odnosno, njihov rad se izmjenjuje: nakon što određena nit završi svoj vremenski odsječak tokom kojeg je završila učitavanje, njeno trenutno stanje će biti pohranjeno u memoriji, te će biti istovareno iz procesora i zamijenjeno sljedećom niti u redu čekanja za izvršenje. - doći će do promjene konteksta na koju se gubi dragocjeno vrijeme. U međuvremenu, podaci se razmjenjuju između procesora i RAM-a zbog ograničene propusnosti sistemske magistrale, mikroprocesor nervozno puši bambus, čekajući sa strane na podatke. Hardverski i softverski (na primjer, iz operativnog sistema) planeri mogu priskočiti u pomoć za učitavanje podataka u keš memoriju. Međutim, keš memorija je vrlo ograničene veličine, tako da ovo rješenje ne može poslužiti kao lijek za sve. Rješenje je bilo paralelno procesiranje, u kojem se nekoliko procesa odvija istovremeno u realnom vremenu. A da bi se to ostvarilo, bilo je potrebno temeljno redizajnirati i rekonstruirati kamen – spojiti dva ili više djelotvornih kristala u jednom tijelu.

Planiranje

Kada se razvija paralelni program, faza dizajna postaje još važnija nego kod razvoja jednonitnih aplikacija. A pošto se, u stvari, paralelno programiranje koristi decenijama u uskom rasponu problema, identifikovani su neki dokazani koncepti. Najvažnije je da se razvoj posmatra drugačije, a ne sekvencijalno, da se istakne jedinica posla koji se obavlja i da se zadatak dekomponuje. Postoje tri metode: dekompozicija prema zadacima, dekompozicija prema podacima, dekompozicija prema tokovima informacija. Prva metoda dekompozicije je najjednostavnija: jednostavno vežemo zasebnu funkciju na određenu nit i pokrećemo je za izvršenje. Paralelna obrada je spremna. Međutim, može doći do problema – svađe – ako izvršna jedinica koristi zajedničke globalne podatke. Ali o tome ćemo kasnije. Druga metoda je također prilično jasna metoda paralelizacije: na primjer, veliki niz podataka se obrađuje u nekoliko niti, od kojih svaka radi na dijelu ograničenom određenim ograničenjima. Dekompozicija po tokovima informacija koristi se za zadatke u kojima rad jedne niti ovisi o rezultatu izvršavanja druge. Na primjer, kada čitate iz datoteke, nit koja rukuje čitanim podacima ne može početi raditi sve dok nit čitača ne pročita određenu količinu podataka.

Hardverska rješenja


Prije prelaska na višejezgrene procesore, programeri procesora su otkrili da prilikom izvršavanja jedne niti, jezgra procesora nije u potpunosti učitana (mislim da za ovo ne morate biti vizionar). A budući da se ne koriste svi resursi mikroprocesora za izvršavanje druge programske niti (budući da se stanje hardvera - izvršne jedinice, keš memorija - može pohraniti u jednoj kopiji), samo područje stanja softverske arhitekture (logika prekida) treba duplicirati. Ova tehnologija se zove hyper-threading. Hyperthreading je hardverski mehanizam u kojem se više nezavisnih hardverskih niti izvršava u jednom ciklusu takta na jednoj superskalarnoj procesorskoj jezgri. Uz njegovu pomoć, jedan fizički procesor je predstavljen kao dva logička, odnosno tako ga vidi operativni sistem, jer se planiranje i izvođenje, zapravo, sprovode sa dva jezgra na umu. Ovo se dešava kroz kontinuirani tok komandi koje se izvode na zajedničkom hardveru. Ova tehnologija je dodata u NetBurst arhitekturu implementiranu u procesore Pentium 4. Stoga je hiperthreading implementiran u najnovijim verzijama Pentiuma 4, ali nekako to nisam mogao uhvatiti u to vrijeme. Ali sada to mogu vidjeti u Atom procesoru instaliranom u netbooku. U ovom kamenu, pored hiperthreading-a, implementirana su više jezgra (dva komada), tako da vidim četiri kamena u operativnom sistemu. Ali, na primjer, u Core 2 Duo, kao ni u Core i5, nema hiperthreadinga. Uz pomoć hiperthreadinga, brzina izvršavanja programa optimiziranih za višenitnost je povećana za 30%. Želio bih naglasiti da će se povećanje performansi dogoditi samo u posebno pripremljenim aplikacijama.

Istovremeno sa hiperthreadingom, pored superskalarne arhitekture, kreirana je i nova EPIC arhitektura, implementirana u Itanium procesorima, ali ova tema više neće stati u današnji članak.

Tada su izmišljeni procesori s više jezgara, koji se danas koriste posvuda. Višejezgarni procesori podržavaju višestruku obradu na čipu. U ovoj arhitekturi, dvije ili više jezgri su implementirane u jednom procesoru instaliranom u jednom soketu. Ovisno o dizajnu, ove jezgre mogu dijeliti veliku keš memoriju na istoj matrici. Višejezgarni procesori takođe zahtevaju kompatibilan čipset. Pošto je svako jezgro nezavisni izvršni modul, procesori sa više jezgara obezbeđuju pravi paralelizam - izvršavanje svake niti u zasebnom okruženju. U slučaju prisustva nekoliko izvršnih jezgara, mora postojati način za razmjenu informacija između njih, bez kojih je jednostavno nemoguće stvoriti paralelni sistem, a potreban je poseban resurs. Da bi se to postiglo, izumljen je napredni programirljivi kontroler prekida (APIC). Razmjenjuje informacije između procesora/jezgri koristeći mehanizam interprocesorskog prekida. Ovo drugo, zauzvrat, operativni sistem koristi za planiranje/izvršavanje niti.

Potrošnja energije također dolazi do izražaja. I to se ne odnosi samo na različite mobilne platforme na baterije, već i na serverske sisteme i desktope. Prvi x86 procesori su trošili djeliće vata, dok današnji vrhunski modeli mogu trošiti 130 vati ili više. U međuvremenu, procesori sa više jezgara štede energiju jer povećanje performansi dolazi zbog paralelizma, a ne od povećanja brzine takta.

Softverska rješenja

Softverska rješenja igraju veliku ulogu u paralelnom izvršavanju koda. Na scenu stupaju i sistemski softverski proizvodi (operativni sistemi, kompajleri) i aplikacije na nivou korisnika. Sa stanovišta programera aplikacija, možemo koristiti samo drugi podskup. Zapravo, ovo je sasvim dovoljno ako je operativni sistem pouzdan. Većina onoga što slijedi odnosi se na Windows NT 6.1, osim ako nije drugačije naznačeno. Kao što znate, Windows NT koristi model preemptivnog višenitnog rada. Kada se aplikacija pokrene, pokreće se proces u kojem jedna ili više niti mogu obavljati svoj posao, a sve dijele zajedničku memoriju i zajednički adresni prostor. Nit je, zauzvrat, odvojena sekvenca naredbi koja se izvršava nezavisno. Postoje tri vrste tokova:

  • korisnički nivo - kreiran u korisničkom programu (na korisničkom nivou). Ove niti u Windows NT-u su mapirane u niti na nivou kernela, što je način na koji ih procesor vidi;
  • nit kernela - kontroliše kernel operativnog sistema;
  • hardverska nit - jedinica koja se izvršava na procesoru.

Stvaranje toka odvija se u tri faze. Prvo se opisuje pomoću API-ja za obradu niti, zatim se u fazi izvršenja ovaj poziv obrađuje kao poziv kernela, kao rezultat kreira se nit, a zatim se izvršava unutar vlastitog procesa. Ali zbog činjenice da se nekoliko radnji istovremeno izvodi u programu, može nastati mnogo problema. Zgodno se mogu svrstati u četiri tipa. Problem sa sinhronizacijom nastaje kada jedna nit čeka na izvršenje druge, koja iz nekog razloga ne može dovršiti izvršenje. Kada postoji problem u komunikaciji, jedna nit ne može blagovremeno prenijeti informacije drugoj, na primjer zbog kašnjenja. Kada je jedan tok pod stresom, a drugi hladan, javlja se problem balansiranja. Ako se, kada se program prenese na moćniji računar, njegove performanse ne povećaju, onda govore o problemu skalabilnosti. Da bi riješili sve ove probleme, primitivi su dizajnirani da rade u okruženju s više niti. Pogledajmo ih na brzinu.

Primitive za paralelno kodiranje

Sekcije koda koje mogu istovremeno koristiti više niti i koje sadrže zajedničke varijable nazivaju se kritične sekcije. U njima se čitanje i pisanje vrijednosti pod djelovanjem dvije ili više niti može dogoditi asinhrono. Ovo stanje se naziva stanje trke. Stoga, samo jedna nit treba da se izvršava unutar kritične sekcije u svakom vremenskom intervalu. Da bi se to osiguralo, koriste se primitivi za sinhronizaciju - zaključavanje. Semafor je istorijski prvi mehanizam za sinhronizaciju, koji je razvio Dijkstra 1968. Dozvoljava određenom broju niti da uđe u kritični dio kada nit uđe u njega, smanjuje njegovu vrijednost i povećava je u trenutku kada izađe. Preduvjet je atomsko izvršavanje operacija provjere vrijednosti semafora + povećanje vrijednosti, kao i provjera vrijednosti + smanjenje vrijednosti. Proširenje semafora je mutex, koji je jednostavno binarni semafor i stoga dozvoljava samo jednoj niti da se izvrši u kritičnom dijelu. Brave čitanja i pisanja omogućavaju više niti da pročitaju vrijednost dijeljene varijable koja se nalazi u kritičnom dijelu, ali upisuje samo u jednu. Dok čeka, spinlock ne blokira, već nastavlja aktivno anketirati zaključani resurs. Spinlocking je loše rješenje za problem sinhronizacije na procesoru s jednom jezgrom jer zauzima sve računske resurse.

Mehanizam varijabli uslova sličan je semaforima, međutim, za razliku od semafora (i muteksa), oni ne sadrže stvarne vrijednosti. Oni prate ispunjenost spoljnih uslova.

Moderni programski jezici sadrže mehanizme visokog nivoa za pojednostavljenje upotrebe zaključavanja i uslovnih varijabli („monitori“). Umjesto da eksplicitno piše operacije zaključavanja i otključavanja na dijelu koda, programer samo treba da proglasi kritični dio kao sinkroniziran.

Za razmjenu informacija između procesa/nitova koriste se poruke podijeljene u tri grupe: unutarprocesne (za prijenos informacija između niti jednog procesa), međuprocesne (za prijenos informacija između procesa - ovisno o nitima) i procesne - procesne (transfer informacija između procesa nezavisan od niti).
U isto vrijeme, kada se koriste brave za izbjegavanje utrka, mogu doći do mrtvih i živih brava. Zastoj nastaje kada je jedna nit blokirana čekajući određeni resurs iz druge niti, ali ta nit ga ne može dati (na primjer, čeka rezultat iz prve). Do zastoja može doći kada su ispunjena četiri dobro definisana uslova (nećemo pokrivati ​​ove uslove u ovom članku). Stoga, prilikom pisanja višenitnog koda, programer ima priliku izbjeći dodlock, ali u praksi to izgleda mnogo teže. Aktivno zaključavanje je gore od mrtvog zaključavanja po tome što su u prvom slučaju niti blokirane, au drugom su stalno u sukobu.

Postoji niz nekompatibilnih programskih interfejsa toka aplikacija. Svi oni u osnovi koriste iste primitive, jedine razlike su u zavisnosti od operativnog sistema. U sljedećim odjeljcima ćemo pogledati načine rada u okruženju s više niti i rješavanje problema istovremenosti korištenjem ovih sučelja.


Win32 teme

Od prve verzije Windows NT-a, višenitno programiranje je poboljšano od verzije do verzije, dok je API za obradu niti također poboljšan. Dakle, kada se proces pokrene pomoću funkcije CreateProcess, on ima jednu nit za izvršavanje naredbi. Nit se sastoji od dva objekta: objekta kernela (preko kojeg sistem kontroliše nit) i steka koji pohranjuje parametre, funkcije i varijable niti. Da biste kreirali dodatnu nit, morate pozvati funkciju CreateThread. Ovo stvara objekat kernela, kompaktnu strukturu podataka koju koristi sistem za kontrolu toka. Ovaj objekat, u stvari, nije nit. Memorija se također dodjeljuje iz adresnog prostora nadređenog procesa za nit. A pošto će se sve niti jednog procesa izvršavati u njegovom adresnom prostoru, oni će dijeliti njegove globalne podatke. Vratimo se na funkciju CreateThread i pogledajmo njene parametre. Prvi parametar je pokazivač na strukturu PSECURITY ATTRIBUTES, koji definira sigurnosne atribute i svojstva nasljeđivanja, mogu se postaviti na zadane vrijednosti prosljeđivanjem NULL. Drugi parametar tipa DW0RD određuje koji dio adresnog prostora nit može koristiti za svoj stog. Treći parametar PTHREAD START_ROUTIME pfnStartAddr je pokazivač na funkciju koja se mora vezati za nit i koju će izvršiti. Ova funkcija mora biti u obliku DWORD WINAPI ThreadFunc(PVOID pvParam), može izvršiti bilo koju operaciju; kada se završi, vratit će kontrolu, a korisnički brojač objekta kernela će biti smanjen za 1 ako je ovaj brojač jednak 0, ovaj objekt će biti uništen. Četvrti parametar funkcije CreateThread je pokazivač na PVOID strukturu koja sadrži parametar za inicijalizaciju funkcije koja se izvodi u niti (pogledajte opis trećeg parametra). Peti parametar (DWORD) specificira oznaku koja pokazuje da li je nit aktivna nakon što je kreirana. Posljednji, šesti parametar (PDWORD) je adresa varijable na kojoj će biti postavljen identifikator niti, ako prosledimo NULL, time ćemo naznačiti da nam nije potreban. Ako je uspješna, funkcija vraća oznaku toka, koja se može koristiti za manipuliranje tokom; ako ne uspije, funkcija vraća 0.


Postoje četiri načina da se nit prekine, od kojih su tri nepoželjna: završetak niti pozivanjem funkcije ExitThread, pozivom TerminateThread ili prekidom nadređenog procesa bez prethodnog prekidanja niti. Samo 1 način - samoprekid toka, koji se javlja prilikom izvođenja radnji koje su mu dodijeljene, je povoljan. Jer samo u ovom slučaju je zagarantovano da će svi resursi operativnog sistema biti oslobođeni i svi C/C++ objekti biti uništeni pomoću njihovih destruktora.

Još nekoliko riječi o kreiranju teme. Funkcija CreateThread nalazi se u Win32 API-ju, a biblioteka Visual C++ ima ekvivalent, _beginthreadex, koji ima gotovo istu listu parametara. Preporučuje se kreiranje niti pomoću njega, jer ne samo da koristi CreateThread, već obavlja i dodatne operacije. Osim toga, ako je nit kreirana korištenjem potonjeg, onda kada se uništi, poziva se _endthreadex, koji briše blok podataka koji zauzima struktura koja opisuje nit.

Niti se planiraju za pokretanje na osnovu prioriteta. Ako bi sve niti imale jednake prioritete, tada bi za svaku nit bilo dodijeljeno 20 ms (u WinNT-u). Ali to nije istina. WinNT ima 31 (od nule) prioritet niti. U isto vrijeme, 31 je najveći broj koji se na njemu može pokrenuti - drajveri uređaja; 0, najniži, rezerviran je za izvršavanje niti nuliranja stranice. Međutim, programer ne može eksplicitno specificirati broj prioriteta za izvršenje njegove niti. Ali u Windows-u postoji tabela prioriteta, u kojoj su naznačene simboličke oznake grupisanih prioritetnih brojeva. U ovom slučaju, konačni broj se formira ne samo na osnovu ove tabele, već i na osnovu vrednosti prioriteta roditeljskog procesa. Vrijednosti su skrivene iza simboličkih konstanti iz razloga što Microsoft zadržava pravo da ih promijeni i koristi ga od verzije do verzije svog operativnog sistema. Kada se kreira, niti dobija normalan nivo prioriteta. Može se promijeniti pomoću funkcije SetThreadPriority, koja uzima dva parametra: HANDLE hThread - deskriptor niti koja se mijenja, int nPriority - nivo prioriteta (iz tabele). Koristeći funkciju GetThreadPriority, možete dobiti trenutni prioritet tako što ćete joj proslijediti deskriptor željene niti. Prije promjene prioriteta niti, ona mora biti suspendirana pomoću funkcije SuspendThread. Nakon promjene prioriteta, nit se mora vratiti planeru za zakazivanje izvršenja pomoću funkcije ResumeThread. Obje funkcije primaju oznaku niti na kojoj rade. Sve opisane operacije osim obustave i nastavka primjenjuju se na procese. Ne mogu se pauzirati/nastaviti jer ne troše CPU vrijeme, pa nisu zakazani.

Izbjegavanje utrka u Win32

U višenitnim aplikacijama, kad god je to moguće, potrebno je koristiti atomsko - nedjeljive operacije u čije izvršavanje ne može ometati druga nit. Takve funkcije u Win32 API-ju imaju Interlocked prefiks, na primjer, za povećanje varijable koristite InterlockedExchangeAdd(&i, 1) umjesto i++. Osim operacija povećanja/dekrementa, postoje i operacije za atomsko poređenje, ali ćemo ih ostaviti kao domaći zadatak.

Atomske funkcije, međutim, omogućuju rješavanje vrlo uskog raspona problema. Kritične sekcije dolaze u pomoć. Win32 ima funkcije za eksplicitno označavanje dijela koda koji će se izvršiti atomski. Prvo morate kreirati instancu strukture kritične sekcije, a zatim u funkciji koja se izvršava u niti napisati operatore za ulazak i izlazak iz kritične sekcije:

CRITICAL_SECTION g_cs; DWORD WINAPI ThreadRun(PVOID pvParam) ( EnterCriticalSection(&g_cs); // Izračunaj nešto LeaveCriticalSection(&g_cs); return 0; )

Kritične sekcije u Win32 nisu samo kod koji se može izvršiti od više niti, oni su čitav mehanizam za sinhronizaciju podataka. Kritični dijelovi trebaju biti što manji, odnosno uključivati ​​što manje proračuna.
Da biste omogućili više niti da pročitaju vrijednost varijable i samo jednoj da je promijeni, možete koristiti SRWLock strukturu "tanko zaključavanje". Prvi korak je inicijalizacija strukture pozivanjem InitializeSRWLock i prosljeđivanjem pokazivača na nju. Zatim, tokom snimanja, ograničavamo resurs na ekskluzivni pristup:

AcquireSRWLockExclusive(PSRWLOCK SRWLock); // Upisujemo vrijednost ReleaseSRWLockExclusive(PSRWLOCK SRWLock);

S druge strane, dok čitamo vršimo zajednički pristup:

AcquireSRWLockShared(PSRWLOCK SRWLock); // Čitanje vrijednosti ReleaseSRWLockShared(PSRWLOCK SRWLock);

Napomena: sve funkcije uzimaju inicijaliziranu strukturu SRWLock kao parametar.
Koristeći uslovne varijable, zgodno je organizovati odnos „dobavljač-potrošač“ (pogledajte dekompoziciju po tokovima informacija), odnosno sledeći događaj treba da se desi u zavisnosti od prethodnog. Ovaj mehanizam koristi funkcije SleepConditionVariableCS i SleepConditionVariableSRW za zaključavanje kritične sekcije ili tanke strukture zaključavanja. Oni uzimaju tri i četiri parametra, respektivno: pokazivač na varijablu stanja koju očekuje nit, pokazivač na kritičnu sekciju ili SRWLock koji se koristi za sinhronizaciju pristupa. Sljedeći parametar je vrijeme (u milisekundama) da nit čeka da uvjet bude ispunjen, ako uvjet nije zadovoljen, funkcija će vratiti False; Posljednji parametar druge funkcije je tip zaključavanja. Da biste probudili blokirane niti, trebate pozvati funkciju WakeConditionVariable ili WakeAllConditionVariable iz druge niti. Ako test izveden kao rezultat pozivanja ovih funkcija potvrdi ispunjenje uvjeta koji je proslijeđen kao parametar ovim funkcijama, nit će se probuditi.

U gornjem opisu upoznali smo se sa općim definicijama semafora i mutex mehanizama. Sada da vidimo kako su implementirani u Win32. Možete kreirati semafor koristeći funkciju CreateSemaphore. Njemu se prosljeđuju sljedeći parametri: pokazivač na strukturu PSECURITY_ATTRIBUTES koja sadrži sigurnosne parametre; maksimalan broj resursa koje aplikacija obrađuje; iznos ovih resursa na početku; Pokazivač na niz koji definira ime semafora. Kada nit koja čeka na semaforu želi pristupiti resursu zaštićenom semaforom, funkcija čekanja niti ispituje stanje semafora. Ako je njegova vrijednost veća od 0, tada je semafor slobodan i njegova vrijednost se smanjuje za 1, a nit je zakazana za izvršenje. Ako je semafor zauzet prilikom prozivanja, njegova vrijednost je 0, tada pozivna nit prelazi u stanje čekanja. U trenutku kada nit napusti semafor, poziva se funkcija ReleaseSemaphore u kojoj se vrijednost semafora povećava za 1. Muteksi, kao i semafori, su objekti kernela. Funkcionisanje muteksa je slično Win32 kritičnim sekcijama, s tom razlikom što se potonji izvršavaju u korisničkom modu. Mutex dozvoljava da se istovremeno izvršava samo jedna nit i pruža pristup samo jednom resursu. Istovremeno, omogućava vam da sinhronizujete više niti pohranjivanjem identifikatora niti koja je uhvatila resurs i brojača za broj hvatanja. Da biste kreirali mutex, možete koristiti funkciju CreateMutex, njeni parametri su slični onima o kojima se raspravljalo gore. Kada se nit čeka na mutex uspješno završi, ona dobiva ekskluzivni pristup zaštićenom resursu. Sve ostale niti koje pokušavaju pristupiti ovom resursu ulaze u stanje čekanja. Kada nit koja zauzima resurs završi s korištenjem, mora osloboditi mutex pozivanjem funkcije ReleaseMutex. Ova funkcija smanjuje brojač rekurzije u mutexu za 1. Izbor mehanizma sinhronizacije koji će se koristiti u velikoj mjeri zavisi od vremena njegovog izvršavanja i koda u kojem se koristi.

Između ostalog, u Windows NT-u, počevši od četvrte verzije, postoji još jedan nivo detalja niti - vlakna (ili niti). Na nivou korisnika, nit objekta kernela može se podijeliti na više niti. A u ovom slučaju, operativni sistem ne zna ništa o njima, sav posao planiranja i upravljanja nitima pada na pleća programera aplikacije.

Zaključak

Stvaranje modernog softvera zahtijeva korištenje paralelizma, a u budućnosti proizvođači procesora prijete samo povećanjem broja jezgara na jednom procesoru. Međutim, višenitno programiranje ima niz teških aspekata: organiziranje sinhronog izvršavanja naredbi, izbjegavanje utrka, i istovremeno optimalno učitavanje hardvera kako bi se postigle povećane performanse zbog paralelizma.

U ovom članku smo se prvo pozabavili primitivima za paralelno kodiranje - općim konceptima, a zatim smo shvatili kako se implementiraju u specifični API - Win 32 niti. Opseg članka nam nije dozvolio da razmotrimo druge API-je za višenitno kodiranje. Nadajmo se da ćemo jednog dana imati priliku da nastavimo sa razgovorom o ovoj neophodnoj temi.

Želim ti puno sreće, vidimo se uskoro!

Operacija