INTRODUÇÃO AO OPENMP PROF. ANDRÉ LEON S. GRADVOHL, DR. [email protected].

29
INTRODUÇÃO AO OPENMP PROF. ANDRÉ LEON S. GRADVOHL, DR. [email protected]

Transcript of INTRODUÇÃO AO OPENMP PROF. ANDRÉ LEON S. GRADVOHL, DR. [email protected].

  • Slide 1
  • 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
  • Slide 13