INTRODUO AO OPENMP PROF. ANDR LEON S. GRADVOHL, DR.
[email protected]
Slide 2
ARQUITETURAS PARALELAS Arquiteturas paralelas: Single
Instruction Multiple Data Mquinas Vetoriais Multiple Instruction
Multiple Data Memria distribuda Memria compartilhada 2 Onde o
OpenMP se encaixa
Slide 3
MODELOS DE PROGRAMAO PARALELA Modelos de Programao Paralela
Multiprocessamento Fork/Join Passagem de Mensagens Exemplo: PVM,
MPI Multithread Exemplo: OpenMP, POSIX-Threads OpenMP (Open
MultiProcessing): Interface de programao que suporta
multiprocessamento em ambientes de memria compartilhada. 3
Slide 4
INTRODUO AO OPENMP Estrutura de um programa OpenMP: Em Fortran:
4 PROGRAM HELLO INTEGER VAR1, VAR2, VAR3 *** Cdigo serial *** Incio
da seo paralela. Fork um grupo de threads. !$OMP PARALLEL
PRIVATE(VAR1, VAR2) SHARED(VAR3) *** Seo paralela executada por
todas as threads *** Todas as threads efetuam um join a thread
mestre e finalizam !$OMP END PARALLEL *** Cdigo serial END PROGRAM
HELLO INTEGER VAR1, VAR2, VAR3 *** Cdigo serial *** Incio da seo
paralela. Fork um grupo de threads. !$OMP PARALLEL PRIVATE(VAR1,
VAR2) SHARED(VAR3) *** Seo paralela executada por todas as threads
*** Todas as threads efetuam um join a thread mestre e finalizam
!$OMP END PARALLEL *** Cdigo serial END
Slide 5
INTRODUO AO OPENMP Estrutura de um programa OpenMP: Em C: 5
#include int main () { int var1, var2, var3; *** Cdigo serial ***
Incio da seo paralela. Fork um grupo de threads. #pragma omp
parallel private(var1, var2) shared(var3) { *** Seo paralela
executada por todas as threads *** Todas as threads efetuam um join
a thread mestre e finalizam } *** Cdigo serial } #include int main
() { int var1, var2, var3; *** Cdigo serial *** Incio da seo
paralela. Fork um grupo de threads. #pragma omp parallel
private(var1, var2) shared(var3) { *** Seo paralela executada por
todas as threads *** Todas as threads efetuam um join a thread
mestre e finalizam } *** Cdigo serial }
Slide 6
INTRODUO AO OPENMP 6 Observaes Fork/Join: Quando uma thread
chega a uma definio de regio paralela, ela cria um conjunto de
threads e passa a ser a thread mestre. A thread mestre faz parte do
conjunto de threads e possui o nmero de identificao 0. A partir do
incio da regio paralela, o cdigo duplicado e todas as threads
executaro esse cdigo. Existe um ponto de sincronizao (barreira) no
final da regio paralela, sincronizando o fim de execuo de cada
thread. Somente a thread mestre continua desse ponto. BA
BBAARRRRBBAARRRRBA BBAARRRRBBAARRRR
Slide 7
INTRODUO AO OPENMP 7 Observaes O nmero de threads Em uma execuo
com o OpenMP, o nmero de threads determinado pelos seguintes
fatores, em ordem de precedncia: 1.Utilizao da funo
omp_set_num_threads() no cdigo Fortran ou C/C++; 2.Definindo a
varivel de ambiente OMP_NUM_THREADS, antes da execuo; 3.Implementao
padro do ambiente: nmero de processadores em um n. Restries No
permitido caminhar para dentro ou fora (branch) de uma estrutura de
blocos definida por uma diretiva OpenMP e somente um IF
permitido.
Slide 8
EXEMPLO #include int main () { int nthreads, tid; #pragma omp
parallel private(nthreads, tid) { tid = omp_get_thread_num();
printf(Ola Mundo do thread = %d\n, tid); if (tid == 0) { nthreads =
omp_get_num_threads(); printf(Numero de threads = %d\n, nthreads);
} Faz o fork dos threads e mantm suas prprias cpias de variveis.
Obtm o nmero do Thread. Se tid == 0, ento o thread mestre. Obtm a
quantidade de threads. Regio Paralela
Slide 9
CRIAO DE THREADS #include int main() { double A[1000]; #pragma
omp parallel num_threads(4) { int ID = omp_get_thread_num();
pooh(ID,A); } return 0; } Criao de 4 threads. Obtm o nmero do
thread. 9
Slide 10
CRIAO DE THREADS EXERCCIOS Matematicamente sabe-se que:
Portanto, possvel aproximar esta integral como um somatrio: Onde
cada retngulo tem largura x e altura F(x i ) no meio do intervalo
i. 10
Slide 11
CRIAO DE THREADS EXERCCIOS Soluo Serial: static long num_steps
= 100000; double step; int main () { int i; double x, pi, sum =
0.0; step = 1.0/(double) num_steps; for (i=0;i< num_steps; i++){
x = (i+0.5)*step; sum = sum + 4.0/(1.0+x*x); } pi = step * sum; }
11
Slide 12
CRIAO DE THREADS EXERCCIOS Soluo Paralela static long num_steps
= 100000000; double step; int main () { int i,j; double pi,
full_sum = 0.0; double sum[MAX_THREADS]; step = 1.0/(double)
num_steps; 12