Académique Documents
Professionnel Documents
Culture Documents
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
Parallelismo de laos.
O usurio explicita o paralelismo dos laos. Paralelismo tipo Fork-Join.
OpenMP
OpenMP
Paralelizao em OpenMP
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.
OpenMP
OpenMP
5 categorias de diretivas
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);
Distribuio de trabalho;
omp for
Sincronizaes;
omp atomic, critical, barrier,. . .
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
Variveis compartilhadas:
variveis estticas; variveis globais.
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(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);
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.
OpenMP
OpenMP
Exemplo de reduo
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) ; }
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.
atomicidade
verso light da SC. funciona apenas para a prxima instruo de acesso memria.
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
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,
OpenMP
OpenMP