Você está na página 1de 15

Introduoao

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

#pragma omp parallel clause


bloco_cdigo;

Indica que o bloco_cdigo para ser


executado em paralelo.
onde clause pode ser:

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

#pragma omp for clause


{ ciclo_for(); }

onde clause pode ser:

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

#pragma omp sections clause


{ #pragma omp section newline
cdigo();
#pragma omp section newline
cdigo();
};
onde clause podeser:

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

void omp_set_num_threads (int)

int omp_get_num_threads (void)

retornaonmeromximodethreadspermitidos

int omp_get_thread_num (void)

retornaonmerodethreadsactivos

int omp_get_max_threads (void)

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;

/* Print environment information */


printf("Number of processors = %d\n", procs);
printf("Number of threads = %d\n", nthreads);
printf("Max threads = %d\n", maxt);
printf("In parallel? = %d\n", inpar);
printf("Dynamic threads? = %d\n", dynamic);
printf("Nested parallelism? = %d\n", nested);
}
} /* Done */

/* Start parallel region */


#pragma omp parallel private(nthreads, tid) {
/* Obtain thread number */
tid = omp_get_thread_num();
/* Only master thread does this */
if (tid == 0) {
printf("Thread %d getting info...\n", tid);
}

FernandoSilvaDCCFCUP

29

Você também pode gostar