OpenMP Day1

1,209 views

Published on

Training/Presentation (in Portuguese) about OpenMP an API to support shared memory multiprocessing. Day 1

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,209
On SlideShare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
2
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

OpenMP Day1

  1. 1. OpenMP<br />André Leon S. Gradvohl, Dr.<br />andre.gradvohl@gmail.com<br />
  2. 2. Plano de Apresentação<br />Arquiteturas Paralelas e Modelos de Programação.<br />Threads<br />Introdução ao OpenMP<br />Hands-On: Primeiros exemplos<br />
  3. 3. Arquiteturas Paralelas e Modelos de Programação<br />Arquiteturas paralelas:<br />Single Instruction Multiple Data<br />Máquinas Vetoriais<br />Multiple Instruction Multiple Data<br />Memória distribuída<br />Memória compartilhada<br />Onde o OpenMP se encaixa<br />
  4. 4. Arquiteturas Paralelas e Modelos de Programação<br />Memória compartilhada<br />P1<br />P2<br />Pn<br />Memória<br />
  5. 5. Arquiteturas Paralelas e Modelos de Programação<br />Modelos de Programação Paralela<br />Multiprocessamento<br />Fork/Join<br />Passagem de Mensagens<br />Exemplo: PVM, MPI<br />Multithread<br />Exemplo: OpenMP, POSIX-Threads<br />
  6. 6. Threads<br />Definição:<br />Threads são linhas de execução diferentes em um mesmo processo.<br />Exemplo:<br />
  7. 7. Threads<br />Conceitos Importantes:<br />Contexto de Hardware<br />UC<br />ALU<br />Barramento<br />SP<br />PC<br />RI<br />R1<br />R2<br />Rn<br />
  8. 8. Threads<br />Conceitos Importantes:<br />Contexto de Software: informações relativas ao processo.<br />Espaço de Endereçamento: área de memória reservada a um processo.<br />
  9. 9. Introdução ao OpenMP<br />OpenMP (Open MultiProcessing):<br />Interface de programação que suporta multiprocessamento em ambientes de memória compartilhada.<br />
  10. 10. Introdução ao OpenMP<br />Estrutura de um programa OpenMP:<br />Em Fortran<br />PROGRAM HELLO<br />INTEGER VAR1, VAR2, VAR3<br />*** Código serial<br />*** Início da seção paralela. “Fork” um grupo de “threads”.<br />!$OMP PARALLEL PRIVATE(VAR1, VAR2) SHARED(VAR3)<br />*** Seção paralela executada por todas as “threads”<br />*** Todas as “threads” efetuam um “join” a thread mestre e finalizam<br />!$OMP END PARALLEL<br />*** Código serial<br />END<br />
  11. 11. Introdução ao OpenMP<br />Estrutura de um programa OpenMP:<br />Em C<br />#include <omp.h><br />intmain () <br />{<br />int var1, var2, var3;<br />*** Código serial<br />*** Início da seção paralela. “Fork” um grupo de “threads”.<br />#pragma omp parallel private(var1, var2) shared(var3)<br />{<br />*** Seção paralela executada por todas as “threads”<br />*** Todas as “threads” efetuam um “join” a thread mestre e finalizam<br />}<br />*** Código serial<br />}<br />
  12. 12. Introdução ao OpenMP<br />Observações<br />Fork/Join:<br />Quando uma thread chega a uma definição de região 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 número de identificação “0”.<br />A partir do início da região paralela, o código é duplicado e todas as threads executarão esse código.<br />Existe um ponto de sincronização (“barreira”) no final da região paralela, sincronizando o fim de execução de cada thread. Somente a thread mestre continua desse ponto.<br />B<br />A<br />RR<br />
  13. 13. Introdução ao OpenMP<br />Observações<br />O número de threads<br />Em uma execução com o OpenMP, o número de “threads” é determinado pelos seguintes fatores, em ordem de precedência:<br />Utilização da função omp_set_num_threads() no código Fortran ou C/C++;<br />Definindo a variável de ambiente OMP_NUM_THREADS, antes da execução;<br />Implementação padrão do ambiente: número de processadores em um nó.<br />
  14. 14. Introdução ao OpenMP<br />Observações<br />Threads dinâmicos<br />Um programa com várias regiões paralelas, utilizará o mesmo número de threads para executar cada região. Isso pode ser alterado permitindo que durante a execução do programa, o número de threads seja ajustado dinamicamente para uma determinada região paralela. Dois métodos disponíveis:<br />Utilização da função omp_set_dynamic() no código Fortran ou C/C++;<br />Definindo a variável de ambiente OMP_DYNAMIC, antes da execução.<br />
  15. 15. Introdução ao OpenMP<br />Observações<br />Regiões paralelas recursivas<br />Uma região paralela dentro de outra região paralela resulta na criação de um novo grupo de threads de apenas uma thread, por default. É possível definir um número maior de threads, utilizando um dos dois métodos disponíveis:<br />Utilização da função omp_set_nested()no código Fortran ou C/C++;<br />Definindo a variável de ambiente OMP_NESTED, antes da execução.<br />
  16. 16. Introdução ao OpenMP<br />Observações<br />Restrições<br />Não é permitido caminhar para dentro ou fora (”branch”) de uma estrutura de blocos definida por uma diretiva OpenMP e somente um IF é permitido.<br />
  17. 17. Introdução ao OpenMP<br />Como os threads interagem, i. e., como se comunicam?<br />Através de compartilhamento de variáveis.<br />O que essa forma de comunicação acarreta?<br />Condições de Corrida!<br />Ler valor<br />Ler valor<br />Soma + 10 = <br />20<br />Subtrai -10 = <br />00<br />10<br />10<br />
  18. 18. Introdução ao OpenMP<br />Como resolver o problema das condições de corrida ?<br />Com sincronização, ou seja, protegendo as posições de memória que são compartilhadas entre threads. <br />Ler valor<br />Ler valor<br />Soma + 10 = <br />20<br />Subtrai-10 = <br />10<br />10<br />20<br />
  19. 19. HandsOn<br />Faz o fork dos threads e mantém suas próprias cópias de variáveis.<br />Obtém o número do Thread.<br />Região Paralela<br />#include <stdio.h><br />#include <omp.h><br />intmain () <br />{ intnthreads, tid;<br /> #pragma omp parallel private(nthreads, tid)<br /> {<br />tid = omp_get_thread_num();<br />printf(“Hello World from thread = %d ”, tid);<br />if (tid == 0)<br /> {<br />nthreads = omp_get_num_threads();<br />printf(“Number of threads = %d ”, nthreads);<br /> }<br /> }<br />}<br />Se tid == 0, então é o thread mestre.<br />Obtém a quantidade de threads.<br />

×