Escolar Documentos
Profissional Documentos
Cultura Documentos
OpenMP
FernandoSilva
DCCFCUP
Recursos
OpenMP.org(http://www.openmp.org)
Tutorial(http://www.llnl.gov/computing/tutorials/openMP/)
Implementaogratuita
OmniOpenMPcompilerproject(http://phase.hpcc.jp/Omni/)
FernandoSilvaDCCFCUP
OqueoOpenMP?
APIparaprogramaoparalelaexplcita
paralelismoemmemriapartilhada
sobretudoparalelismonosdados
Constitudapor:
directivasdecompilao,
bibliotecadefunes,
evariveisdeambiente
Objectivoobterumstandarddeprogramao
apoiadopelosgrandesfabricantesdesoftwaree
hardware
FernandoSilvaDCCFCUP
OqueoOpenMP(cont.)?
Portvel
versespara
C/C++(ver.1.0em1998)
eFortran(verso1.0em1997)
implementaesparaUNIX/LinuxeWindows
Significado:
OpenspecificationsforMultiProcessingviacollaborative
workfromsoftware/hardwareindustry,academiaand
government
FernandoSilvaDCCFCUP
UmProgramaSimplesemOpenMP
Directivasdecompilaooupragmas
identificampontoseformasdeparalelizao
nfasenaparalelizaodeciclos
Programasequencial
voidmain()
{
doubler[1000];
Programaparalelo
voidmain()
{
doubler[1000];
for(inti=0;i<1000;i++){
large_computation(r[i]);
}
}
#pragmaompparallelfor
for(inti=0;i<1000;i++){
large_computation(r[i]);
}
}
FernandoSilvaDCCFCUP
ModelodeProgramaodoOpenMP
Paralelismoexplcito
anotaesfeitaspeloprogramador
Modelodememriapartilhada
baseadoemthreads
trabalhodivididoporthreadsdeexecuo
variveispodemser
partilhadasportodososthreads
duplicadas(privadas)paracadathread
threadscomunicamatravsdasvariveispartilhadas
Usarsincronizaoparaevitarcompetioentre
threads
FernandoSilvaDCCFCUP
OpenMPModelodeExecuo
Modelodeexecuotipoforkjoin
iniciaexecuocomumprocesso(masterthread)
noinciodoconstrutorparalelocriaumteamofthreads
aocompletaroteamofthreadssincronizanumabarreira
implcita
apenasomastercontinuaaexecuo
FernandoSilvaDCCFCUP
C/C++EstruturaGeraldoCdigo
#include <omp.h>
main() {
int var1, var2, var3;
parte_sequencial_1();
#pragma omp parallel private(var1,var2) shared(var3)
{
parte_paralela(); // executada pelos threads
...
// Todos os threads fazem o join com o master e terminam
}
parte_sequencial_2();
}
FernandoSilvaDCCFCUP
OpenMP:DirectivasC/C++
#pragma ompdirectivename[clause,]newline
directivename
umadirectivaOpenMPvlida.Temdeaparecerdepoisdo
pragmaeantesdasclasulas
[clause,]
Opcional.Podemapareceremqualquerordemesenecessrio
repetidas.
newline
Obrigatrio.Seguidodoblocoestruturadoquevaiserexecutado
emparalelo.
Exemplo:
#pragmaompparalleldefault(shared)private(beta,pi)
FernandoSilvaDCCFCUP
CompilaoCondicional:_OPENMP
#ifdef_OPENMP
bloco_cdigo;
#endif
Exemplodecdigo:
printf(%dprocessadoreslivres\n,omp_get_num_procs());
Possibilitainstrumentalizarocdigo
FernandoSilvaDCCFCUP
10
Syntaxparallel
if(exp)
private(list)
firstprivate(list)
num_threads(int_exp)
shared(list)
default(shared|none)
copyin(list)
reduction(operator: list)
FernandoSilvaDCCFCUP
11
ClasulasOpenMP
Asclasulasprivate,shared,defaultefirstprivate
possibilitamaoutilizadorocontrolodombitodas
variveisnaregioparalela.
private(list)
firstprivate(list)
asvariveisdalistaficamprivadasacadathreaddoteam
nosoincializadas
permitequeasvariveisprivadassejaminicializadas
shared(list)
asvariveisdalistasopartilhadasportodososthreads
pordefeitoasvariveissoshared
FernandoSilvaDCCFCUP
12
Quantosthreads?
Onmerodethreadsnaregioparalela
determinadopelosseguintesfactores(ordemde
precedncia):
clasulanum_threads(int)
funoomp_set_num_threads()
varivelambienteOMP_NUM_THREADS
defaultdependedaimplementao
Osthreadssonumeradosde0aN1
Pordefeito,umprogramacomvriasregiesem
paralelousaromesmonmerodethreadspara
cadaregio,amenosqueredefinacomoexplicado.
FernandoSilvaDCCFCUP
13
OutrasClasulas:reduction,copyineif
reduction(operador:lista)permiteoperarsobre
asvariveisdalista
copyin(list)possibilitaaatribuiodomesmovalora
variveisTHREADPRIVATE
if(exp)temdeavaliarcomoverdadeiroparaqueo
teamdethreadssejacriado,senoaexecuoser
sequencial.
FernandoSilvaDCCFCUP
14
ProgramaHello!
#include<omp.h>
main(){
intnthreads,tid;//Forkteamthreads,cadaumacpiadasvariveis.
#pragmaompparallelprivate(nthreads,tid)
{//Obtemeescrevethreadid
tid=omp_get_thread_num();
printf("HelloWorldfromthread=%d\n",tid);
//apenasomasterthreadfazisto
if(tid==0){
nthreads=omp_get_num_threads();
printf("Numberofthreads=%d\n",nthreads);
}
}/*Todosostheardsjuntamsenomaster
}
FernandoSilvaDCCFCUP
15
Constructoresdeworksharing
Especificamregrasdedivisodetrabalhoentreos
threads,nocriaosthreads!
Tiposdepartilha:
forpartilhaasiteraesdeumciclopelosthreadsda
team(dataparalelism).
sectionsdivideotrabalhoemsecesdiscretas,
distintas,quesoexecutadaspelosthreads.Podeser
usadoparaparalelismofuncional.
singleserializaocdigo
FernandoSilvaDCCFCUP
16
Syntaxfor
private(list)
firstprivate(list)
lastprivate(list)
reduction(operator: list)
ordered
schedule(type)
Nowait
Ocompiladordistribuiasiteraespelosthreads
FernandoSilvaDCCFCUP
17
FernandoSilvaDCCFCUP
18
Exemplofor
Clasulasschedule
comodividirasiteraesdociclopelosthreads.
staticasiteraessoagrupadasemconjuntos
(chunks),estaticamenteatribudosaosthreads.
dynamicasiteraessaagrupadasembocados
(chunks)esodinamicamentedistribudospelos
threads;quandoumtermina,recebedinamicamente
outrochunk.
guidedindicaonmeromnimodeiteraesa
agruparnumatarefa;
runtimeadecisotomadaemtempode
execuoapartirdavar.OMP_SCHEDULE
FernandoSilvaDCCFCUP
19
Exemplo dousodadirectivafor
#include <omp.h>
#define CHUNKSIZE 100
#define N 1000
main() {
int i, chunk;
float a[N], b[N], c[N];
/* Algumas inicializacoes */
for (i=0; i < N; i++)
a[i] = b[i] = i * 1.0;
chunk = CHUNKSIZE;
#pragma omp parallel shared(a,b,c,chunk) private(i) {
#pragma omp for schedule(dynamic,chunk) nowait
for (i=0; i < N; i++)
c[i] = a[i] + b[i];
} // fim da seco paralela/
}
FernandoSilvaDCCFCUP
20
Exemplosections
FernandoSilvaDCCFCUP
21
Syntaxsections
private(list)
firstprivate(list)
lastprivate(list)
reduction(operator: list)
nowait
FernandoSilvaDCCFCUP
22
Exemplosections
#include <omp.h>
#define N 1000
main() {
int i, chunk;
float a[N], b[N], c[N];
// Some initializations
for (i=0; i < N; i++)
a[i] = b[i] = i * 1.0;
#pragma omp parallel shared(a,b,c) private(i) {
#pragma omp sections nowait {
#pragma omp section
for (i=0; i < N/2; i++) c[i] = a[i] + b[i];
#pragma omp section
for (i=N/2; i < N; i++) c[i] = a[i] + b[i];
} // fim de seces
}
FernandoSilvaDCCFCUP
23
ConstructoresdeSincronizao
ompmasterespecificarumaregioqueser
executadaapenaspelomaster(osoutrosignoram)
ompcriticalespecificaumaregiocrticadecdigo
quedeveserexecutadaapenasporumthreadde
cadavez.
ompbarrierquandoestadirectivaalcanadapor
umthread,esteesperaatqueosrestnates
cheguemaomesmoponto.
FernandoSilvaDCCFCUP
24
ConstructoresdeSincronizao(cont.)
ompatomicespecificaumendereodememria
paraactualizaoatmica.
ompflushidentificaumpontodesincronizaono
qualnecessrioprovidenciarumavisoconsistente
damemria.
omporderedespecificaqueasiteraesdevem
serexecutadaspelamesmaordem,comosefossem
executadasseuqencialmente.
FernandoSilvaDCCFCUP
25
FunesOpenMP
retornaonmeromximodethreadspermitidos
retornaonmerodethreadsactivos
invocadanapartesequencial.
retornaoIDdothread(entre0et-1)
int omp_get_num_procs(void)
retornaonmerodeprocessadoresdisponveisparao
programa
FernandoSilvaDCCFCUP
26
FunesOpenMP(cont)
void omp_init_lock(omp_lock_t*)
void omp_destroy_lock(omp_lock_t*)
void omp_set_lock(omp_lock_t*)
libertaolock
double omp_get_wtime(void)
esperaatconseguirolock
void omp_unset_lock(omp_lock_t*)
Inicializaumlockassociadovariveldelock
retornaoonum.segundosdecorridos(elapsedtime)
double omp_get_wtick(void)
retornaossegundosdecorridosentrechamadas
sucessivas
FernandoSilvaDCCFCUP
27
ExemploReduo
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]) {
int
i, n;
float a[100], b[100], sum;
n = 100; /* Some initializations */
for (i=0; i < n; i++)
a[i] = b[i] = i * 1.0;
sum = 0.0;
#pragma omp parallel for reduction(+:sum)
for (i=0; i < n; i++)
sum = sum + (a[i] * b[i]);
printf("
Sum = %f\n",sum);
}
FernandoSilvaDCCFCUP
28
ExemplosfunesOpenMP
/* Get environment information */
procs = omp_get_num_procs();
nthreads = omp_get_num_threads();
maxt = omp_get_max_threads();
inpar = omp_in_parallel();
dynamic = omp_get_dynamic();
nested = omp_get_nested();
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]){
int nthreads, tid, procs, maxt, inpar,
dynamic, nested;
FernandoSilvaDCCFCUP
29