Descomposició de tasques · 3.1
Regió paral·lela
Passes de la teoria al codi amb OpenMP. Tot comença a la regió paral·lela: un bloc que crea un team de threads, amb una barrera implícita al final.
Conceptes clau
- OpenMP
#pragma omp parallel- Team de threads: master i workers
num_threads(N)- Barrera implícita
Fins ara ens hem centrat en com ha de ser una bona descomposició en tasques: mida, repartiment i estructura. Ara passem a la pràctica i veurem com es creen i s’executen aquestes tasques en codi. Ho farem amb OpenMP, una API estàndard per a programació paral·lela en memòria compartida (principalment en C/C++ i Fortran).
En OpenMP, el punt de partida és la regió paral·lela: un bloc que crea el conjunt de threads que compartiran la càrrega de treball i dins del qual es generen i s’executen les unitats de treball.
La directiva #pragma omp parallel delimita una regió que s’executa amb un team de threads. Un d’ells és el master (id 0) i la resta actuen com a workers. Tots els threads comparteixen el mateix espai de memòria, i el runtime d’OpenMP s’encarrega de crear el team i gestionar-ne l’execució.
El nombre de threads el decideix el runtime per defecte (normalment, un per core disponible), però es pot especificar explícitament amb la clàusula num_threads:
// codi sequencial
#pragma omp parallel [num_threads(N)]
{
... // codi executat dins la regio paral·lela
} // barrera implicita: espera tots els threads
// codi sequencial
La regió parallel incorpora una barrera implícita al final: cap thread pot sortir-ne fins que tots han acabat. Això garanteix que l’execució seqüencial no es reprèn mentre algun thread encara treballa dins del bloc.