Top Banner
Mini Curso: Programação Paralela utilizando OpenMP Arthur F. Lorenzon Antonio Carlos S. B. F. Henrique O. Gressler Márcia C. Cera
69

Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

Aug 08, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

Mini Curso: Programação Paralela utilizando OpenMP

Arthur F. Lorenzon Antonio Carlos S. B. F.

Henrique O. GresslerMárcia C. Cera

Page 2: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

2

Quem somos...

● Arthur Francisco Lorenzon:

● Bacharel em CC pela UNIPAMPA

● Aluno do PPGC/UFRGS

● Integrante do Laboratório de Sistemas Embarcados – UFRGS

● Henrique de Oliveira Gressler

● Márcia Cristina Cera

● Antonio Carlos S. B. Filho

Page 3: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

3

Quem somos...

● Arthur Francisco Lorenzon

● Henrique de Oliveira Gressler:

● Bacharel em Ciência da Computação pela UNIPAMPA

● Márcia Cristina Cera

● Antonio Carlos S. B. Filho

Page 4: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

4

Quem somos...

● Arthur Francisco Lorenzon

● Henrique de Oliveira Gressler

● Márcia Cristina Cera:

● Doutorado em Computação pela UFRGS

● Professora Adjunta da UNIPAMPA

● Pesquisadora da área de PPD

● Antonio Carlos S. B. Filho

Page 5: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

5

Quem somos...

● Arthur Francisco Lorenzon

● Henrique de Oliveira Gressler

● Márcia Cristina Cera

● Antonio Carlos S. B. Filho:

● Pós-Doutorado em Computação – UFRGS

● Professor Adjunto da UFRGS

● Bolsista de Produtividade em Pesquisa do CNPq – Nível 2

Page 6: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

6

Experiência dos Palestrantes...

● Diversas aplicações paralelizadas utilizando OpenMP

● Diversos trabalhos publicados utilizando OpenMP

● Participação em eventos/grupos de pesquisa:

● Maratona de Programação Paralela – Petrópolis/RJ 2012

● Grupo de Estudos para Maratonas de Prog. Paralela – GEMPP

● Trabalho de Conclusão de Curso

Page 7: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

7

Objetivos deste Mini-Curso

● Programação Paralela

● Técnicas de Programação Paralela com OpenMP

● Teoria

● Prática

● Desafios Futuros para a área de PPD

Page 8: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

8

Roteiro

● Evolução dos Microprocessadores

● Cenário Atual

● Programar Paralelo, Porque? Onde? Como?

● OpenMP:

● Noções Básicas

● Paralelismo de Laços

● Paralelismo de Seções

● Diretivas de Sincronização

● Desafios Futuros

Page 9: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

9

Evolução dos Microprocessadores

Page 10: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

10

Evolução dos Microprocessadores

Sobreposição na execução de etapas da instrução

IF ID EX ME WBIF ID EX ME WB

IF ID EX ME WB

Page 11: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

11

Evolução dos Microprocessadores

Múltiplas Unidades FuncionaisHardware: SuperscalarSoftware: VLIW

Page 12: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

12

Evolução dos Microprocessadores

Melhora do desempenho utilizando técnicas de computação paralela!

Page 13: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

13

Evolução dos Microprocessadores

Preocupação com gerenciamento de energia!!!

Page 14: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

14

Evolução dos Microprocessadores

Paralelismo no Nível de ThreadAumento da Performance

Page 15: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

15

Arquiteturas Multi-Core

● De forma simplificada um processador multi-core é colocar dois ou mais processadores num mesmo processador/chip.

● Trabalho de processsamento ficará dividido entre os cores.

CPU 0 CPU 1

Page 16: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

16

Arquiteturas Multi-Core

● De forma simplificada um processador multi-core é colocar dois ou mais processadores num mesmo processador/chip.

● Trabalho de processsamento ficará dividido entre os cores.

CPU 0 CPU 1

Page 17: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

17

Arquiteturas Multi-Core

● De forma simplificada um processador multi-core é colocar dois ou mais processadores num mesmo processador/chip.

● Trabalho de processsamento ficará dividido entre os cores.

CPU 0 CPU 1

Page 18: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

18

Programação Paralela

“Programação Paralela é a capacidade de dividirmos

uma carga de trabalho entre vários processadores

dinamicamente e de forma eficiente!”

Page 19: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

19

O que paralelizar?

● Previsão do tempo e do clima

● Cálculos matemáticos

● Processamento de imagens

● Simuladores

● Componentes de Jogos*

Page 20: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

20

Porque Paralelizar?

● Processamento simultâneo de diversas tarefas

● Melhorar aproveitamento do hardware – ciclos ociosos

● Aumentar o desempenho da CPU

● Aplicações mais rápidas e eficientes – Redução do tempo de computação

Page 21: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

21

Cenário Atual

Arquiteturas Multicore

Ferramentas

Motivos

Aplicações

Prós Contra

Page 22: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

22

Cenário Atual

Arquiteturas Multicore

Ferramentas

Motivos

Aplicações

Prós Contra

Pensamento e ProgramaçãoSequencial

Page 23: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

23

Programar Paralelo é Díficil?

Page 24: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

24

Identificando Oportunidades de Paralelismo

● Estudar a aplicação:

● Tempo de execução● Ferramentas de geração de profile● Avaliar potênciais funções e loops

● Identificar tarefas que possam ser executadas concorrentemente

● Definir a maneira mais eficiente de paraleliza-lá

● Obter um código paralelo ideal pode levar horas, dias, semanas e até meses

Page 25: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

25

1. Preparar a tinta = 30 s;

2. Pintar 300 estacas = 3000 s;

3. Aguardar tinta secar = 30 s;

Quanto tempo levará um pintor?

Exemplo

Page 26: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

26

1. Preparar a tinta = 30 s;

2. Pintar 300 estacas = 3000 s;

3. Aguardar tinta secar = 30 s;

Quanto tempo levará um pintor?

Exemplo

3060 s

Page 27: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

27

1. Preparar a tinta = 30 s;

2. Pintar 300 estacas = 3000 s;

3. Aguardar tinta secar = 30 s;

Quanto tempo levará um pintor?

Exemplo

3060 s

1530 s 1560 s

Quanto tempo levarão dois pintores?

Page 28: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

28

1. Preparar a tinta = 30 s;

2. Pintar 300 estacas = 3000 s;

3. Aguardar tinta secar = 30 s;

Quanto tempo levará um pintor?

Exemplo

3060 s

1530 s 1560 s

Quanto tempo levarão dois pintores?

Page 29: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

29

Exemplo

● Sempre existirão partes sequenciais em um programa!

1. Preparar a tinta

2. Pintar 300 estacas

3. Aguardar tinta secar

Região Paralela

Região Sequencial

Região Sequencial

Page 30: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

30

Exemplo

● Sempre existirão partes sequenciais em um programa!

1. Preparar a tinta

2. Pintar 300 estacas

3. Aguardar tinta secar

Região Paralela

Região Sequencial

Região Sequencial

Pintar 150

Secar a tinta

Preparar a tinta

Pintar 150Pintar 300

Secar a tinta

Preparar a tinta

Tempo

Sequencial:

Tempo

Paralelo:

Page 31: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

31

Modelos de Programação Paralela

Memória Distribuída Memória Compartilhada

Page 32: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

32

● Open Multi-Processing

● Teve início por volta de 1997

● Padrão que define como os compiladores devem gerar códigos paralelos através de diretivas e funções. (Não é linguagem!)

● Disponível para Fortran 77, Fortran 90, C e C++

● Baseia-se na criação de várias threads que compartilham o mesmo recurso de memória

● Regiões Privadas

● Regiões Compartilhadas

Noções Básicas de OpenMP

Page 33: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

33

● Open Multi-Processing

● Teve início por volta de 1997

● Padrão que define como os compiladores devem gerar códigos paralelos através de diretivas e funções. (Não é linguagem!)

● Disponível para Fortran 77, Fortran 90, C e C++

● Baseia-se na criação de várias threads que compartilham o mesmo recurso de memória

● Regiões Privadas

● Regiões Compartilhadas

Noções Básicas de OpenMP

Page 34: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

34

● Facilidade de conversão de programas seqüenciais em paralelos

● Fácil compreensão e uso das diretivas

● Minimiza a interferência na estrutura do algoritmo

● Compila e executa em ambientes paralelo e sequencial

● Maneira simples de explorar o paralelismo

Noções Básicas de OpenMP

Page 35: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

35

● Facilidade de conversão de programas seqüenciais em paralelos

● Fácil compreensão e uso das diretivas

● Minimiza a interferência na estrutura do algoritmo

● Compila e executa em ambientes paralelo e sequencial

● Maneira simples de explorar o paralelismo

Noções Básicas de OpenMP

!!! CUIDADO !!!

OpenMP é simples, mas demanda conhecimento: - Aplicação - Arquitetura - Melhor “opção” de paralelismo

Page 36: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

36

Modelo de Programação

Page 37: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

37

Elementos do OpenMP

#pragma omp diretiva [cláusula]

omp_serviço(...)OMP_NOME

Page 38: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

38

● Consiste em uma linha de código com significado especial para o compilador.

● Identificadas pelo #pragma omp

● Formato padrão:

#pragma omp nome_diretiva [cláusula,...] novaLinha

● Inclusão header: “omp.h”

Diretivas de Compilação

Construtor ParaleloConstrutores de Compartilhamento de Trabalho

Diretivas de Sincronização

Page 39: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

39

● Diretiva mais importante do OpenMP

● Informa ao compilador a área que deverá ser executada em paralelo

Construtor Paralelo

#include <omp.h>int main(){

#pragma omp parallel{printf(“Ola Mundo\n”);

}}

if, private, shared, firstprivate, default,

copyin, reduction num_threads

Page 40: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

40

● Exemplos:● www.inf.ufrgs.br/~aflorenzon/curso_OpenMP/

● gcc nome_programa.c -o nome_saida -fopenmp

● hello.c e exemplo1.c

Construtor Paralelo

#include <omp.h>int main(){

#pragma omp parallel{

for(i=0;i<n;i++)a[i] = b[i]+c[i];

}}

Page 41: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

41

● Exemplos:● www.inf.ufrgs.br/~aflorenzon/curso_OpenMP/

● gcc nome_programa.c -o nome_saida -fopenmp

● hello.c e exemplo1.c

Construtor Paralelo

#include <omp.h>int main(){

#pragma omp parallel{

for(i=0;i<n;i++)a[i] = b[i]+c[i];

}}

O que há de errado com o código ao lado?

Page 42: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

42

● Exemplos:● www.inf.ufrgs.br/~aflorenzon/curso_OpenMP/

● gcc nome_programa.c -o nome_saida -fopenmp

● hello.c e exemplo1.c

Construtor Paralelo

#include <omp.h>int main(){

#pragma omp parallel{

for(i=0;i<n;i++)a[i] = b[i]+c[i];

}}

O que há de errado com o código ao lado?

Variáveis compartilhadas entre todas as

threads, por padrão!

Page 43: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

43

● Exemplos:● www.inf.ufrgs.br/~aflorenzon/curso_OpenMP/

● gcc nome_programa.c -o nome_saida -fopenmp

● hello.c e exemplo1.c

Construtor Paralelo

#include <omp.h>int main(){

#pragma omp parallel private(i){

for(i=0;i<n;i++)a[i] = b[i]+c[i];

}}

Variáveis de controlede laço devem ser

privadas à cada thread!

Page 44: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

44

● Construtor de Compartilhamento de Trabalho:

● Responsáveis pela distribuição de trabalho entre as threads e determinam como o trabalho será dividido entre as threads.

● Necessariamente interna a uma região paralela.

#pragma omp construtor[clausula [clausula] …]

– #pragma omp for

– #pragma omp sections

– #pragma omp single

Construtor Paralelo

Page 45: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

45

● #pragma omp for

– Iterações dos laços for são executadas em paralelo.

– Número de iterações deve ser previamente conhecido e não possui variação durante a execução – (while).

– Implementa SIMD (Single Instruction Multiple Data).

Construtor de Trabalho

Page 46: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

46

● #pragma omp for

– Iterações dos laços for são executadas em paralelo.

– Número de iterações deve ser previamente conhecido e não possui variação durante a execução – (while).

– Implementa SIMD (Single Instruction Multiple Data).

Construtor de Trabalho

#include <omp.h>int main(){

#pragma omp parallel private(i){ #pragma omp for

for(i=0;i<n;i++) a[i] = b[i]+c[i];

}}

Ex: ex_omp_for_1.c

Page 47: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

47

● #pragma omp for

– Schedulers alteram a forma como as iterações do loop são distribuídas entre as threads

– #pragma omp for schedule (name_schedule, chunk)

– Guided, Dynamic, Static and Runtime

Construtor de Trabalho

Page 48: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

48

● Cláusula schedule:

Construtores de Trabalho

Ex: ex_omp_for_static.c

ex_omp_for_dynamic.cex_omp_for_guided.c

Page 49: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

49

Intervalo

● Nos vemos novamente as 21:00 hs para a segunda etapa do curso!

● OpenMP Sections

● Diretivas de Sincronização

● Desafios Futuros

● Considerações Finais

Page 50: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

50

● #pragma omp sections

– Utilizado para dividir tarefas entre as threads em blocos de códigos que não possuem iterações.

Construtor de Trabalho

#include <omp.h>int main(){

#pragma omp parallel {

#pragma omp sections{

#pragma omp sectioninstrução

#pragma omp sectioninstruçao

}}

}

Page 51: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

51

● #pragma omp sections

– Utilizado para dividir tarefas entre as threads em blocos de códigos que não possuem iterações.

Construtor de Trabalho

#include <omp.h>int main(){

#pragma omp parallel {

#pragma omp sections{

#pragma omp sectioninstrução

#pragma omp sectioninstruçao

}}

}

Região paralela

Indica que cada thread irá executar um bloco

de instruções diferentes

Qual instrução que cadathread irá executar

Fim região paralela

Page 52: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

52

● #pragma omp sections

– Manter coerência entre número de blocos x número de threads– Mais blocos → algumas threads irão executar mais de um bloco– Mais threads → algumas threads ficarão ociosas– Apenas uma thread → execução seqüencial– Implementa MIMD (Multiple Instructions Multiple Data)

Construtor de Trabalho

Serial Paralelo

Page 53: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

53

● #pragma omp sections

Construtor de Trabalho

#include <omp.h>int main(){

#pragma omp parallel {

#pragma omp sections{

#pragma omp sectionsoma_vet(a,b,c);

#pragma omp sectionmult_vet(a,b,d);

#pragma omp sectiondiv_vet(a,b,e);

#pragma omp sectionsub_vet(a,b,f);

}}

}

Ex1: ex_omp_sections.cEx1: ex_omp_sections.c

Page 54: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

54

● #pragma omp sections

Construtor de Trabalho

#include <omp.h>int main(){

#pragma omp parallel {

#pragma omp sections{

#pragma omp sectionsoma_vet(a,b,c);

#pragma omp sectionmult_vet(a,b,d);

#pragma omp sectiondiv_vet(a,b,e);

#pragma omp sectionsub_vet(a,b,f);

}}

}

Ex1: ex_omp_sections.cEx1: ex_omp_sections.c

Ex1: ex_omp_sections.cEx2: ex_omp_sections_2.c./ex_omp_sections_2 numero_threads

Ex1: ex_omp_sections.comp_set_num_threads(NUM)

Page 55: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

55

● #pragma omp single

● Trecho de código será executado apenas por uma thread

● Demais threads aguardam em uma barreira implícita

Construtor de Trabalho

#include <omp.h>int main(){

#pragma omp parallel {

#pragma omp singleprintf(“Inicio região paralela\n”);

#pragma omp for…

}}

Page 56: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

56

● Primeiro devemos entender o que são “condições de corrida”

● Quando duas ou mais threads tentam atualizar, ao mesmo tempo, uma mesma variável

● Quando uma thread atualiza uma variável e outra acesso o valor ao mesmo tempo

● Quando isto acontece, o resultado tende a ser incorreto!

Diretivas de Sincronização

Page 57: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

57

● Primeiro devemos entender o que são “condições de corrida”

● Quando duas ou mais threads tentam atualizar, ao mesmo tempo, uma mesma variável

● Quando uma thread atualiza uma variável e outra acesso o valor ao mesmo tempo

● Quando isto acontece, o resultado tende a ser incorreto!

Diretivas de Sincronização

Diretivas de sincronização garantem que o acesso ou atualização de uma determinada variável

Compartilhada aconteça no momento certo

Page 58: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

58

● Construtores:

● Critical:

– Restringe a execução de uma determinada tarefa a apenas uma thread por vez

● Atomic

● Barrier

Diretivas de Sincronização

Page 59: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

59

● Construtores:

● Critical:

– Restringe a execução de uma determinada tarefa a apenas uma thread por vez

● Atomic:

– Um local específico da memória deve ser atualizado atomicamente, ao invés de deixar várias threads tentarem escrever nele

– Em essência, esta directiva prevê uma seção mini-critical.

● Barrier

Diretivas de Sincronização

Page 60: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

60

● Construtores:

● Critical

● Atomic

● Barrier:

– Utilizada para sincronizar todas as threads em um determinado ponto do código

Diretivas de Sincronização

Page 61: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

61

● Classificadas em:

● Funções de ambiente de execução

● Funções de bloqueio

● Funções de tempo

Funções de Interface

Page 62: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

62

● Paralelismo utilizando tasks!

● Utilizado para paralelizar algoritmos irregulares:

● Recursividade

● Repetições utilizando While

● Exemplos de aplicações:

● Algoritmos de ordenação → Merge sort, Quick sort...

● Manipulação de ponteiros → Listas

OpenMP Avançado

Page 63: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

63

● #pragma omp task

● Interna a uma região paralela

● Thread que executar o #pragma omp task criará uma nova task

OpenMP Avançado

#include <omp.h>int main(){

#pragma omp parallel {

#pragma omp single nowaitsort();

}}

void sort(){….for(i=0;i<N;i++){

#pragma omp tasksort();

}}

Page 64: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

64

● Poderosa API de programação paralela

● Fácil implementação

● Pouca modificação do código sequencial

● Bastante utilizada para computação hibrida (MPI + OpenMP)

Resumo OpenMP

Page 65: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

65

Desafios Futuros - Exascale

Page 66: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

66

Desafios Futuros – Eficiência Energética

Page 67: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

67

● Eficiência Energética

● Aumentar/Manter desempenho

● Diminuir o consumo de energia

● Arquiteturas Heterogêneas

Desafios Futuros

Page 68: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

68

● Eficiência Energética

● Aumentar/Manter desempenho

● Diminuir o consumo de energia

● Arquiteturas Heterogêneas

Desafios Futuros

Page 69: Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013

Muito Obrigado!Perguntas

[email protected]@unipampa.edu.br

Arthur F. Lorenzon Antonio Carlos S. B. F.

Henrique O. GresslerMárcia C. Cera

[email protected]@inf.ufrgs.br