Caracteristici suplimentare OpenMP

2.3 Caracteristici suplimentare OpenMP

Variabilele de mediu și funcții auxiliare

Înainte de a începe programul de numărul de fire care execută o regiune paralelă poate fi stabilită prin determinarea valorii OMP_NUM_THREADS variabile de mediu. Valoarea implicită a OMP_NUM_THREADS variabile depinde de punerea în aplicare. este posibil să se schimbe programul prin apelarea funcției omp_set_num_threads ().

void omp_set_num_threads (num int)

Următorul exemplu demonstrează funcția și NUM_THREADS opțiunea utilizare omp_set_num_threads (). Înainte de prima omp_set_num_threads apel funcție regiune paralele (2) numărul de filamente este setat egal cu 2. Dar NUM_THREADS (3) opțiune se aplică pentru prima regiune paralelă. ceea ce indică faptul că această zonă ar trebui să fie efectuată în trei direcții. Prin urmare, mesajul „Parallel Regiunea 1“ va fi afișat în trei fire. A doua opțiune paralelă NUM_THREADS regiune nu este aplicabilă, valoare stabilită omp_set_num_threads funcției totuși valabile (2). și mesajul „Parallel zona 2“ va fi afișat în două fire.

În unele cazuri, sistemul poate modifica dinamic numărul de fire utilizate pentru a executa o regiune în paralel, de exemplu, pentru a optimiza utilizarea resurselor de sistem. Este permis să facă în cazul în care OMP_DYNAMIC variabilă de mediu este setat la true. În sistemele cu o schimbare dinamică a numărului de fire nu este definit în mod implicit, în caz contrar valoarea implicită: false. variabilă OMP_DYNAMIC poate fi setat folosind funcția omp_set_dynamic ().

void omp_set_dynamic (num int)

Deoarece valoarea parametrului funcției omp_set_dynamic () este setat la 0 sau 1. În cazul în care sistemul nu se modifică în mod dinamic numărul de fire, atunci omp_set_dynamic funcția de apel () OMP_DYNAMIC variabilă nu se schimbă. Aflați valoarea OMP_DYNAMIC posibile folosind funcția omp_get_dynamic ().

int omp_get_dynamic (void)

Următorul exemplu demonstrează utilizarea omp_set_dynamic () și omp_get_dynamic (). Valoarea Mai întâi imprimate, funcția omp_get_dynamic () a primit - vă permite să aflați valoarea implicită OMP_DYNAMIC. Apoi, utilizați omp_set_dynamic () funcție variabilă OMP_DYNAMIC setată la true. ceea ce confirmă emiterea unui alt timp valorile funcției omp_get_dynamic (). Apoi, este generată o regiune paralelă, realizează un număr predeterminat de filamente (128). În regiunea paralelă este tipărit numărul real de fire executându-l. Directiva permite imprimarea de master numai proces de master. În sistemele cu un număr de fire modifică în mod dinamic o valoare emise poate fi diferită de la o dată (128).

# includ
# includ
int main (int argc. char * argv [])
<
printf ( "Valoarea OMP_DYNAMIC% d \ n". omp_get_dynamic ().);
omp_set_dynamic (1);
printf ( "Valoarea OMP_DYNAMIC% d \ n". omp_get_dynamic ().);
# Pragma OMP NUM_THREADS paralele (128)
<
# Maestru OMP Pragma
<
printf ( "Parallel regiune. fire% d \ n".
omp_get_num_threads ());
>
>
>

Funcția omp_get_max_threads () returnează numărul maxim de fire utilizate în următoarea regiune paralelă.

int omp_get_max_threads (void)

omp_get_num_procs () întoarce numărul de procesoare disponibile pentru a fi utilizate de către programul de utilizator în momentul apelului. Rețineți că numărul de procesoare disponibile pot fi modificate dinamic.

int omp_get_num_procs (void)

Zonele paralele pot fi imbricate; implicit regiunea paralelă imbricate este executat de un singur fir. Acest lucru este controlat prin setarea mediului OMP_NESTED variabila. Modificarea valorii variabilei poate OMP_NESTED prin apelarea funcției omp_set_nested ().

void omp_set_nested (int nested)

omp_set_nested) Funcția (activează sau dezactivează paralelism imbricată. Deoarece valoarea parametrului este setat la 0 sau 1. Dacă paralelismul imbricate activat, fiecare fir în care îndeplinesc descrierea regiunii paralelă a execuției sale pentru a genera un nou set de fire. Ea a dat naștere la un fir în noul grup va fi fir-maestru. În cazul în care sistemul nu acceptă paralelism imbricat, această funcție va avea nici un efect.

Următorul exemplu demonstrează utilizarea regiunilor paralele imbricate și funcția omp_set_nested (). Apelați funcția omp_set_nested () înainte de prima parte permite utilizarea regiunilor paralele nested. Pentru a determina numărul firului apeluri omp_get_thread_num funcția () utilizată în secțiunea de curent paralelă. Fiecare toron regiune paralelă exterior va crea subiecte noi, fiecare dintre care imprimă un număr împreună cu numărul de fire de spawned. Apelul următor omp_set_nested () interzice utilizarea regiunilor paralele imbricate. În a doua parte a unei regiuni paralele imbricată va fi executată fără generarea de noi fire, care poate fi văzută din emisiunea rezultată.

Aflați valoarea OMP_NESTED posibilă cu ajutorul funcției omp_get_nested ().

int omp_get_nested (void)

omp_in_parallel () returnează 1 dacă aceasta a fost cauzată de zona activă a programului paralel.

omp_in_parallel int (void)

Următorul exemplu ilustrează funcția utilizare omp_in_parallel (). Modul Funcție arată funcționalitatea de schimbare în funcție de faptul dacă este numit dintr-o regiune de serie sau în paralel. Secvența regiunii de imprimat „regiune de serie și în paralel -“ regiune paralelă ".

cronometrie

Returnează timpul scurs în secunde:

omp_get_wtime double (void);

Returnează precizia timer, a fost utilizată funcția descrisă anterior:

omp_get_wtick double (void);

articole similare