Vous êtes sur la page 1sur 6

Bibliograa

OpenMP
Nicolas Maillard nicolas@inf.ufrgs.br
Instituto de Informtica Universidade Federal do Rio Grande do Sul

OpenMP home-page: http://www.openmp.org/presentations Parallel Programming in OpenMP. R. Chandra et al., Morgan Kaufmann, 2001.

2007

OpenMP

OpenMP

Abordagem SPMD
Uso de anotaes (diretivas) para acrescentar uma linguagem usual.
pragma openmp Whatever you want( ) Uma precompilao permite tornar o cdigo seqencial. Funciona com C, C++, Fortran.

Disponibilidade de OpenMP

Consrcio de fabricantes de HW/SW:


(Compaq), HP, IBM, Intel, SGI, SUN. PGI, KAI, PSR, Absoft DOE, NAG, ASCI, . . .

Single Program Multiple Data


Um programa s executado por todos os processadores.

Compiladores OpenMP complient


PGI Intel gcc 4.3.0 (SVN)

Norma de especicao alto-nvel para mquina com memria compartilhada.


= camada mais abstrata em cima de threads.

Parallelismo de laos.
O usurio explicita o paralelismo dos laos. Paralelismo tipo Fork-Join.

OpenMP

OpenMP

Paralelizao em OpenMP

Comunicao entre threads

Identique seus laos pesados; Distribua-os: Verso seqencial double res[10000]; for (i=0 ; i<10000 ; i++) calculo_pesado(&res[i]); Verso paralela double res[10000]; #pragma omp parallel for for (i=0 ; i<10000 ; i++) calculo_pesado(&res[i]); Via a memria compartilhada.
Possibilidade de denir as variveis compartilhadas.

Necessidade de sincronizar os acessos.


isso implica em sobrecusto; OpenMP esconde isso ao programador; necessidade de projetar o algoritmo (distribuio dos dados, volume de acessos remotos. . . ).

OpenMP

OpenMP

5 categorias de diretivas

Denio de regies paralelas


Criao de threads

Regies paralelas;
omp parallel

OMP PARALLEL
double A[10000]; omp_set_num_threads(4); #pragma omp parallel { int th_id = omp_get_thread_num(); calculo_pesado(th_id, A); } printf(Terminado);

Compartilhamento dos dados;


omp shared, private,. . .

Distribuio de trabalho;
omp for

Sincronizaes;
omp atomic, critical, barrier,. . .

runtime funes e variveis de ambiente.


omp_set_num_threads(), omp_set_lock(),. . . OMP_SCHEDULE, OMP_NUM_THREADS, . . .

a chave abrindo sinaliza o incio da execuo das threads; a chave fechando sincroniza as threads; A compartilhado. Obs: usou-se funes OpenMP alm das diretivas.

OpenMP

OpenMP

Compartilhamentoao dos dados

Alterar o compartilhamento de dados

Variveis compartilhadas:
variveis estticas; variveis globais.

Variveis privadas a cada thread:


variveis locais a um bloco; variveis alocadas na pilha de um procedimento chamado por uma seo paralela.

Existem clusulas para especicar, varivel por varivel, o que compartilhar. As clusulas completam as diretivas omp parallel, omp sections ou omp for.
shared( toto ) especica que a varivel toto compartilhada; private( titi ) especica que a varivel titi privada: cria uma cpia privada em cada thread; default(private) e default(shared) existem tambm.

OpenMP

OpenMP

Distribuio de trabalho
for pode ser anotado para ser distribudo. OMP FOR
int i; #dene N 1000 #pragma omp parallel #pragma omp for for (i=0 ; i<N ; i++) { calculo_pesado(i); } printf(Terminado);

omp for schedule

omp for schedule(static [, step]) : distribuio esttica das iteraes por bloco (de tamanho step) entre as threads; omp for schedule(dynamic [, step]) : distribuio dinmica (cclica) das iteraes por bloco entre as threads; omp for schedule(guided [, step]) : distribuio esttica das iteraes por bloco entre as threads; o tamanho do bloco diminui a medida que o clculo anda; omp for schedule(runtime) : o escalonamento dos laos deixado para ser determinado execuo (OMP_SCHEDULE).

As iteraes so distribudas entre as threads. Tem uma barreira no nal do lao. omp for complementado pela diretiva schedule para especicar como fazer a distribuio.

OpenMP

OpenMP

Exemplo comparativo

Exemplos

OMP PARALLEL
#pragma omp parallel { int th_id = omp_get_thread_num(); int nb_th = omp_get_num_threads(); int inicio = th_id * 10000 / nb_th; int m = (th_id+1)*10000 / nb_th; for (i=inicio ; i<m ; i++) a[i] = a[i]+b[i]; } printf(Terminado);

OMP FOR #pragma omp parallel #pragma omp for schedule(static) for (i=0 ; i<10000 ; i++) a[i] = a[i]+b[i]; printf(Terminado);

PRIVATE
int soma = 0 ; #pragma omp parallel for schedule(static) private(soma) for (i=0 ; i<10000 ; i++) soma += a[i]; printf(Terminado soma = %d, soma);

PRIVATE
int soma = 0 ; #pragma omp parallel for schedule(static) #pragma omp rstprivate(soma) lastprivate(soma) for (i=0 ; i<10000 ; i++) soma += a[i]; printf(Terminado);

2 problemas: inicializao + valor nal!

Resolveu o problema da inicializao e do m!

OpenMP

OpenMP

Exemplos

Reduo

PRIVATE
int soma = 0 ; #pragma omp parallel for schedule(static) private(soma) for (i=0 ; i<10000 ; i++) soma += a[i]; printf(Terminado soma = %d, soma);

PRIVATE
int soma = 0 ; #pragma omp parallel for schedule(static) #pragma omp rstprivate(soma) lastprivate(soma) for (i=0 ; i<10000 ; i++) soma += a[i]; printf(Terminado);

Mais uma clusula: reduction(op : list); usada para operaes tipo all-to-one:
exemplo: op = + cada thread ter uma cpia da(s) varivel(is) denidas em list com a devida inicializao; ela efetuar a soma local com sua cpia; ao sair da seo paralela, as somas locais sero automaticamente adicionadas na variavl global.

2 problemas: inicializao + valor nal!

Resolveu o problema da inicializao e do m!

OpenMP

OpenMP

Exemplo de reduo

Distribuio de trabalho (2)

Reduo
#include <omp.h> #dene NUM_THREADS 4 void main( ) { int i, tmp, res = 0; #pragma omp parallel for reduction(+:res) private(tmp) for (i=0 ; i< 10000 ; i++) { tmp = Calculo( ); res += tmp ; } printf(O resultado vale %d, res) ; }

Pode-se usar omp section quando no se usam laos: OMP SECTIONS


#pragma omp parallel #pragma omp sections { Calculo1( ); #pragma omp section Calculo2( ); #pragma omp section Calculo3( ); }

As sees so distribudas entre as threads. Obs: os ndices de laos sempre so privados.

OpenMP

OpenMP

Sincronizaes
Existe vrias instrues para sincronizar os acessos memra compartilhada: seo crtica
#pragma omp critical {. . . } Apenas uma thread pode executar a SC num dado momento.

Funes de biblioteca para o run-time

atomicidade
verso light da SC. funciona apenas para a prxima instruo de acesso memria.

No so diretivas! Funes para setar/consultar parmetros durante a execuco:


nmero de threads: omp_set_num_threads, omp_get_num_threads; nmero de processadores: omp_num_procs( ). locks: existe um tipo omp_lock_t e primitivas: omp_init_lock( ), omp_set_lock( ), etc. . .

barreira:
#pragma omp barrier barreiras implcitas nos ns das sees paralelas!

master e ordered.
#pragma omp ordered: impe a ordem de execuo seqncial. #pragma omp master: apenas a thread master executa o bloco.
OpenMP
OpenMP

Alternativa: variveis de ambiente

Diversos

No so diretivas mas no aparecem no cdigo! Variveis para setar/consultar parmetros antes a execuco:
nmero de threads: OMP_NUM_THREADS, tipo de escalonamento (runtime): OMP_SCHEDULE,

O nmero de threads especicado pelo usurio indicativo.


O runtime pode, na verdade, mapear as tarefas para um nmero menor de threads.

Isso pode tipicamente acontecer em laos aninhados.

OpenMP

OpenMP

Vous aimerez peut-être aussi