OpenMP este o bibliotecă pentru limbile de programare Fortran, C, C ++ care permite paralel de rulare de coduri pe sisteme multiprocesor sau procesoare cu HyperThreading. Built-in compilator gcc de la versiunea 4.2. Dezvoltat cu participarea activă a Intel, pentru care mulți le mulțumesc.
Există mai multe reguli pentru activarea acestui mod:
Paralelizarea poate fi introdusă în secțiunea programului, adică un anumit bloc va fi executat de mai multe ori (specificat de utilizator) sau pentru buclele for. În primul caz nu ne vom opri, puteți citi despre el în prezentarea OpenMP_talk. vom menționa doar paralelizarea ciclurilor.
În acest exemplu, bucla for va fi executată în două fire și nu puteți determina în prealabil ce secvență de valori ale variabilei i execută corpul buclă. Astfel, trebuie să scăpați de dependența de pasul anterior.
De exemplu, dacă aveți acest ciclu:
Apoi trebuie convertită în forma:
Foarte des există un astfel de caz:
Variabila va acumula valori și depinde de iterație. Dacă rulați programul în modul paralel, puteți obține răspunsuri diferite. După cum înțeleg, problema este aceea de a adăuga la o valoare variabilă A [i]. Din memorie, ave este copiată în registrul procesorului. este însumată, iar noua valoare este înscrisă în locația de memorie a acestei variabile. În intervalul dintre citire și scriere, un alt proces poate scrie o valoare sumată nouă, care va fi apoi pierdută și nu luată în considerare.
Contul unui astfel de caz se numește reducere și este declarat după cum urmează pentru variabilele:
După aceea, pentru fiecare variabilă, se creează și se inițiază o copie locală în funcție de operația op - +, *, - (ciudat și / nu) 0, respectiv 1, respectiv 0. După calcul, această copie locală este combinată cu variabila globală.
Astfel, înregistrarea corectă a exemplului anterior este următoarea:
Dacă doriți să utilizați un generator de numere aleatorii într-o buclă care urmează să paraleze, trebuie să fiți foarte atent, deoarece dacă utilizați o anumită secvență de numere pseudo-aleatoare pentru a face acest lucru, ele se pot suprapune. Detalii despre acest lucru sunt scrise în OpenMP_talk.
Deci, sunteți gata să programați paralelizarea ciclurilor. Regulile de bază sunt de a elimina dependențele de la iterație, este recomandabil să se utilizeze numai variabilele buclă locală în interiorul buclelor, pentru a se monitoriza îndeaproape alocările variabilelor globale (evidențiați aceste cazuri ca o reducere). Asigurați-vă că ați comparat rezultatele înainte și după.
Atenție vă rog! Am avut dificultăți în crearea și ștergerea obiectelor dinamice dintr-o buclă, așadar vă recomand să luați aceste operațiuni în afara bucla.
Performanța optimă a calculatorului dvs.!