Calcul paralel - un mod de organizare de calcul, în care programele sunt concepute ca un set de interacțiune proceselor de calcul care rulează simultan.
Există diferite moduri de a face calcule paralele: fiecare proces de calcul poate fi implementat ca un sistem de operare de proces sau de procese de calcul poate fi un set de fire de execuție în cadrul unui proces. Hrană (sau mai corect fluxul de execuție) - cea mai mică unitate de procesare, dintre care executarea poate fi atribuit nucleul sistemului de operare. fluxuri multiple de execuție pot exista în cadrul aceluiași proces și partaja resurse, cum ar fi memoria, în timp ce procesele nu împărtășesc aceste resurse. aplicatii paralele pot fi realizate fizic sau secvențial pe un singur procesor - coada de interspersing pași fiecare efectuarea unui proces de calcul sau paralel - alocând fiecărui proces de calcul unul sau mai multe procesoare (sau aproape de rețeaua de calculatoare distribuite).
Principala dificultate în proiectarea de programe paralele - pentru a asigura secvența corectă a interacțiunilor dintre diferitele procese de calcul și împărțirea resurselor, cum ar fi de memorie sau periferice.
În unele sisteme de programare paralele, transferul de date între componente este ascuns de programator, în timp ce în altele trebuie să fie specificat în mod explicit. interacțiunile explicite pot fi împărțite în două tipuri:
1. Interacțiunea prin memorie partajată (de exemplu, Java sau C #). Acest tip de programare paralelă, necesită de obicei o anumită formă de control pentru a coordona captare interconectate fluxurile.
2. Comunicații prin trimiterea de mesaje. Schimb de mesaje poate avea loc în mod asincron, sau folosind metoda „rendez-vous“, în care expeditorul este blocat, atâta timp cât mesajul nu va fi livrat. mesagerie asincronă poate fi de încredere (Remis) sau nesigure. Sisteme paralele, bazate pe schimbul de mesaje, de multe ori sunt mai ușor de înțeles decât sistemele de memorie partajată, și, în general, considerată ca fiind o metodă mai bună de programare paralelă. Schimb de mesaje pot fi puse în aplicare în mod eficient pe multiprocesor simetrice ca o coerență memorie partajată, și fără ea.
Există destul de multe tehnologii diferite de programare paralelă. Mai mult decât atât, aceste tehnologii nu diferă atât de mult limbaje de programare ca o abordare arhitecturală pentru construirea de sisteme paralele. De exemplu, unele tehnologii necesită construirea unor decizii paralele bazate pe mai multe calculatoare (atat la unul si diferite tipuri), în timp ce alții sugerează că a fost opera o singură mașină cu mai multe nuclee de procesare. În prezent, programul principal de a crea instrumente de programare paralele sunt:
1. OpenMP utilizate în sistemele de memorie partajată paralele (de exemplu, calculatoare cu moderne procesoare multi-core);
2. MPI (Message Passing Interface) este un standard de transmitere a mesajelor între procesele de execuție paralele utilizate în elaborarea programelor de supercalculatoare;
3. POSIX Fire este implementarea standard de fire de execuție;
4. Sistemul de operare Windows a construit-in-suport pentru aplicații multi-threaded pentru C ++ API nivel;
5. PVM (Parallel Virtual Machine) vă permite să combinați rețele eterogene de calculatoare conectate la o resursă de calcul comună.
Sistemele bazate pe mai multe calculatoare aparțin clasei de sisteme de calcul distribuit. Aceste soluții sunt folosite pentru o lungă perioadă de timp. Cel mai izbitor exemplu de tehnologie de calcul distribuit - MPI (Message Passing Interface - Message Passing Interface). MPI este cea mai comună interfață standard pentru schimbul de date în programarea paralelă, există punerea sa în aplicare pentru numărul mare de platforme de calculator. MPI oferă programator cu un singur mecanism de interacțiune a ramurilor în cadrul unei aplicații paralele, indiferent de arhitectura de calculator (cu un singur procesor / multi generale / memorie separată), aranjamentul reciproc al ramurilor (pe același procesor sau pe diferite).
Din moment ce MPI este destinat în primul rând pentru sistemele cu memorie separată, apoi utilizați pentru a organiza un proces paralel într-un sistem cu memorie partajată este extrem de dificil nepractice. Cu toate acestea, nimic nu împiedică să facă MPI soluție pentru o singură mașină.
Dar, sistem de programare în paralel pentru a rula pe o singură mașină, a început să evolueze relativ recent. Desigur, acest lucru nu este în întregime o idee nouă, dar a fost odată cu apariția sistemelor multi-core de pe piață pentru calculatoare personale, dispozitive mobile, cum ar fi tehnologia OpenMP dezvoltat în mod semnificativ.
Este important să se paralel tehnologia de programare sprijină capacitatea de a face un program paralel treptat. Desigur, programul ideal pentru paralel ar trebui să scrie imediat paralel, probabil, pe unele limbaj funcțional, în cazul în care problema nu este în valoare de paralelism. Dar, în practică, este necesar treptat la paraleliza scrise în concordanță cu scopul de a îmbunătăți performanța. În acest caz, tehnologia OpenMP este foarte potrivit pentru acest lucru. Aceasta permite selectarea aplicației, cea mai mare nevoie de loc paralelizare, în primul rând pentru a face paralele cu acestea. Procesul de dezvoltare versiuni paralele poate fi întreruptă, pentru a produce versiunea intermediară a programului, reveni la ea după cum este necesar. Acesta este motivul pentru care, în special, tehnologia OpenMP a devenit destul de popular.
OpenMP (Open Multi-Processing) - un set de directive compilator, rutine de bibliotecă și variabile de mediu, care sunt folosite pentru a programa aplicații multithreaded pe sistemele multiprocesor cu memorie partajată.
Elaborarea caietului de sarcini OpenMP sunt mai mulți mari producători de hardware și software, a căror activitate este reglementată de către o organizație non-profit numit OpenMP Architecture Review Board (ARB).
OpenMP pune în aplicare de calcul paralel, prin filetare, în care „firul principal» (master) creează un set de sclav (sclav), fluxurile și sarcina distribuite între ele. Se presupune că firele sunt executate în paralel pe o mașină cu mai multe procesoare (numărul de procesoare nu trebuie să fie mai mare sau egal cu numărul de fire).
Sarcinile efectuate de fluxuri în paralel, precum și datele necesare pentru a efectua aceste sarcini sunt descrise cu ajutorul directivelor preprocesorul speciale ale limbii - Pragma. De exemplu, porțiunea de cod în limbaj Fortran pentru a executa mai multe fire, fiecare dintre acestea are propria copie a variabilei N, precedat de următoarea directivă. $ OMP PARALELĂ PRIVATE (N)
Cantitatea de noi fluxuri pot fi ajustate ca programul in sine prin apelarea procedurilor de bibliotecă și extern, folosind variabile de mediu.
sunt elemente cheie OpenMP
1. Proiectarea pentru crearea unui flux (directiva paralelă);
2. Distribuția lucrărilor de construcții între fluxuri (Directiva DO / pentru și secțiunea);
3. Structura pentru controlul funcționării datelor (expresii comune și variabile private pentru definirea clasa de memorie);
4. Structura de sincronizare fir (directiva critică, atomic și bariera);
5. Suport bibliotecă procedură de execuție (de exemplu, omp_get_thread_num);
6. Variabilele de mediu (de exemplu, OMP_NUM_THREADS).
OpenMP folosește modelul de execuție în paralel „furculiță-se alăture“. Programul OpenMP începe ca un singur fir de executie, numit fluxul inițial. În cazul în care fluxul întâlnește construcția în paralel, se creează un nou grup format din fir în sine și un număr de fluxuri suplimentare, și devine master în noul grup. Toți membrii noului grup (inclusiv master) executa codul din interiorul construcției paralel. există o barieră implicită la capătul construcției paralele. După structurile paralele continuă executarea de cod de utilizator numai fluxul principal. În regiunea paralelă poate fi imbricat în alte regiuni paralele, în care fiecare flux al originalului devine regiunea principală a grupului său fir. regiunile imbricate pot conține, la rândul lor regiuni nivel mai profund de imbricare.
Numărul de fire din grup, care rulează în paralel, pot fi controlate în mai multe moduri. Unul dintre ei - folosesc mediul OMP_NUM_THREADS variabile. Un alt mod - de a apela omp_set_num_threads procedură (). O altă modalitate - de a utiliza NUM_THREADS expresie în conjuncție cu directiva paralelă.
În acest program, cele două tablouri (a și b) se adaugă până la zece fire paralele.
int main (int argc, char * argv [])
Acest program poate fi compilat folosind gcc-4.4 și mai nou, cu pavilion -fopenmp. Evident, dacă eliminați fișierul antet de conexiune omp.h, și solicită, de asemenea, funcția de configurare OpenMP, programul poate compila orice compilator C ca un program secvențial normal.
OpenMP este susținută de mai multe compilatoare moderne:
1. compilatoare Sun Studio sprijină specificația formală - OpenMP 2.5 - cu performanțe îmbunătățite pentru sistemul de operare Solaris; suport Linux este planificat pentru următoarea lansare.
3. CCG 4.2 sprijină OpenMP, iar unele distribuții (cum ar fi Fedora Core 5 GCC), inclusiv suport pentru versiunea lor de GCC 4.1.
4. Intel C ++ Compiler, inclusiv versiunea Intel Cluster OpenMP pentru sistemele de memorie de programare distribuite.
Message Passing Interface (MPI, Message Passing Interface) - Interfață de programare a aplicațiilor (API) pentru transmiterea de informații, care vă permite să facă schimb de mesaje între procese care efectuează o singură sarcină. Proiectat de William Grouppom, Evin Lasky (ing.) Și alții.
MPI este cea mai comună interfață standard pentru schimbul de date în programarea paralelă, există punerea sa în aplicare pentru un număr mare de platforme de calculator. Folosit pentru a dezvolta programe pentru clustere si supercalculatoare. Principalul mijloc de comunicare între procese în MPI este de a transmite mesaje unul altuia. Standardizati MPI implicat MPI Forum. Standardul MPI descrie o interfață de mesaje care trebuie să fie susținută atât platforma și aplicațiile de utilizator. În prezent, există un număr mare de implementări libere și comerciale ale MPI. Există implementări pentru Fortran 77/90, C și C ++.
MPI axat în principal pe sisteme cu memorie distribuite, adică atunci când costurile de transfer de date sunt ridicate, în timp ce OpenMP axat pe sisteme cu memorie partajată (partajat cu polinucleare Ash). Ambele tehnici pot fi utilizate împreună pentru a face utilizarea optimă a sistemului de cluster multinuclear.
Cele mai multe implementari moderne MPI suporta versiunea 1.1. Standardul MPI 2.0 este susținută de cele mai multe implementari actuale, cu toate acestea, unele caracteristici pot să nu fie puse în aplicare până la sfârșitul anului.
transmiterea și primirea de mesaje între procese individuale;
procesele de interacțiune colective;
interacțiune a proceselor în grupuri;
implementarea Topologii proceselor;
procesele de generare și gestionare dinamică;
comunicații one-way (te / Pune);
de intrare și ieșire în paralel;
operațiunile colective extinse (procese pot efectua operațiuni colective nu numai într-un singur dispozitiv, dar, de asemenea, în mai multe comunicatori).
Mecanismul de bază de comunicare între procese MPI este transmiterea și primirea mesajelor. Mesaj transmite datele și informațiile pentru a permite părții destinatare să efectueze tehnica lor de prelevare a probelor transmise:
1. Poster - rank (număr per grup) expeditorul mesajului;
2. beneficiarul - rangul al destinatarului;
3. indicarea - poate fi utilizat pentru a separa diferite tipuri de mesaje;
4. Communicator - un cod de grup proces.
transmite și primi operațiuni pot fi blocate și nu blocat. Pentru operațiunile de non-blocare definite funcția de testare de pregătire și funcționare stand-by.
Mai jos este un exemplu al unui program de calcul al limbii numărul de π C folosind MPI:
// Conectați antetele necesare
// Conectarea fișierului antet MPI
// functie pentru calcule intermediare
f dublu (dublu a)
întoarce (4.0 / (1.0+ a * a));
// Scutire subsistem MPI
Cele mai frecvente implementări ale MPI până în prezent sunt:
MPICH - cea mai frecventă punerea în aplicare a gratuit, ruleaza pe sistemele bazate pe UNIX și Windows NT
Aceasta susține o varietate de sisteme de comunicații (inclusiv Myrinet).
implementare MPI pentru Windows - WMPI
MPI / PRO pentru Windows NT - implementare comercială pentru Windows NT
Intel MPI - implementare comercială pentru Windows / Linux
Microsoft MPI parte a Compute Cluster Pack SDK. Se bazează pe MPICH2, dar include instrumente suplimentare de management de locuri de muncă. Sprijinit de specificația MPI-2.
HP-MPI - punerea în aplicare comercială de la HP
SGI MPT - plătit biblioteca MPI de la SGI
Mvapich - punerea în aplicare fără MPI pentru Infiniband
Deschideți MPI - punerea în aplicare fără MPI, LAM mostenitor / MPI
ClusterTools Oracle HPC - implementare gratuit pentru Solaris SPARC / x86 și Linux-Open MPI
MPJ - MPI pentru Java
POSIX Fire - implementarea standardului POSIX de fire care definește un API pentru crearea și gestionarea acestora.
Bibliotecile care implementează acest standard (și funcțiile standard), numit de obicei pthreads (funcții au prefixul «pthread_»). Deși opțiunile pentru sistemele de operare Unix, cum ar fi Linux sau Solaris cel mai bine cunoscut, dar există, de asemenea, realizarea pentru Microsoft Windows (Pthreads-W32)
Pthreads definește un set de tipuri și funcții ale limbajului de programare C. Fișier Antet - pthread.h.
1. pthread_t - descriptor curs de apa;
2. pthread_attr_t - lista de atribute de filet.
flux funcția de control:
1. pthread_create () - crearea unui fir;
2. pthread_exit () - finalizare a debitului (funcția de curgere trebuie să fie chemat la sfârșit);
3. pthread_cancel () - anularea fluxului;
4. pthread_join () - blochează executarea unui fir la un alt fir de terminare specificat în apelul funcției;
5. pthread_detach () - elibera resursele ocupate de fluxul (în cazul în care se realizează fluxul, eliberarea de resurse apar după finalizarea acesteia);
6. pthread_attr_init () - inițializarea structura fluxului de atribute;
7. pthread_attr_setdetachstate () - indică sistemul care la finalizarea fluxului se poate elibera în mod automat resursele ocupate de fluxul;
8. pthread_attr_destroy () - eliberați memoria din structura de atribut flux (distrugerea descriptor).
Sincronizare filet Funcții:
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 ().
Exemplu fluxurilor într-o limbă C:
wait_thread static void (void)