+ All Categories
Home > Documents > Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS()...

Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS()...

Date post: 27-Jul-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
28
1/28 Introdu¸ ao ` aprograma¸c˜ ao paralela em Fortran usando OpenMP e MPI Henrique Gavioli Flores,Alex Lima de Mello, Marcelo Trindade Rebonatto Universidade de Passo Fundo 5 de Abril de 2018 1 / 28
Transcript
Page 1: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

1/28

Introducao a programacao paralela em Fortranusando OpenMP e MPI

Henrique Gavioli Flores,Alex Lima de Mello,Marcelo Trindade Rebonatto

Universidade de Passo Fundo

5 de Abril de 2018

1 / 28

Page 2: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

2/28

Sumario

I IntroducaoI Fortran

Compiladores

I OpenMP

Programacao com OpenMP

I MPI

Programacao com MPI

I Consideracoes finais

2 / 28

Page 3: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

3/28

Introducao

I FORmula TRANslationI Uma das primeiras linguages de Alto Nıvel (HLL)

A de maior sucessoMais pratica e com desempenho similar a Assembly

I Evolucao dos computadores e das linguagens de programacao

Processamento ParaleloProgramacao Paralela

I OpenMP: interface de programacao para multiprocessamento

I MPI: padrao de trocas de mensagens

3 / 28

Page 4: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

4/28

Fortran

I Desenvolvida na IBM entre os anos de 1954 e 1957

John W. Bacus+ pesquisadores e desenvolvedores

I Adotada por cientistas para a escrita de programas com basematematica

I Sobrevive a mais de 60 anos

Diversas versoes ao longo do tempoVersoes para processamento de Alto Desempenho

I Fortran e largamente utilizada ate hoje.

Aplicacoes com grande necessidade de operacoes matematicasAlta complexidade

I Eta, DSSAT

4 / 28

Page 5: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

5/28

Compiladores Fortran

I Utilizado para pesquisa cientıficaI Aplicacoes de alto desempenho

OpenMP,MPI,CUDA,OpenACC

I Alguns compiladores mais utilizados:

gfortran(GNU)pgfortran(PGI)ifort(Intel)XL Fortran(IBM)Cray(Cray)

5 / 28

Page 6: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

6/28

Compiladores Fortran com OpenMP e MPI

I OpenMP

Incluido por padraoNecessario informar a flag durante a compilacao do codigo

I MPI

Necessita que uma implementacao do MPI seja instaladaExemplo: MPICH2, OpenMPI

I Com SO Linux Ubuntu

libopenmpi-devopenmpi-bingfortran

6 / 28

Page 7: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

7/28

OpenMP

I API para programacao paralela

I Memoria compartilhada

I Proposta em 1997 na SuperComputing Conference

I Disponıvel pra C/C++ e Fortran

I Utiliza o modelo Fork/Join

7 / 28

Page 8: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

8/28

OpenMP

8 / 28

Page 9: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

9/28

Programacao com OpenMP

I Compilando em Fortran com OpenMP

9 / 28

Page 10: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

10/28

Programacao com OpenMP

I Pragma

definido em Fortran por ”!$”compiladores nao compatıveis tratam como comentarioserve para definir o inıcio de uma diretiva OpenMP.

10 / 28

Page 11: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

11/28

Programacao com OpenMP

I Funcoes basicasOMP GET NUM THREADS()

Retorna o numero de threads utilizadas em uma secao paralela

OMP GET MAX THREADS()

Retorna a quantidade maxima de threads a serem usadas

OMP SET NUM THREADS(nthreads)

Define a quantidade de threads a serem usadas pelas secoes paralelas

OMP GET THREAD NUM()

Retorna o numero identificador(ID) da thread, variando de 0(threadmaster) ate OMP GET NUM THREADS() -1.

11 / 28

Page 12: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

12/28

Programacao com OpenMP

12 / 28

Page 13: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

13/28

Programacao com OpenMP

I !$OMP PARALLEL (!$OMP END PARALLEL)

Marca um bloco a ser processado em paralelovariaveis: Shared, private, firstprivate e lastprivate

13 / 28

Page 14: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

14/28

Programacao com OpenMP

I !$OMP MASTER (!$OMP END MASTER)

Delimita um bloco de codigo a ser executado apenas pela threadmaster(OMP GET THREAD NUM() == 0)

I !$OMP SINGLE (!$OMP END SINGLE)

Delimita um bloco de codigo a ser executado apenas pela primeirathread que encontrar a diretiva, intependente de sua ID

I !$OMP CRITICAL (!$OMP END CRITICAL)

Indica que o codigo entre as diretivas sera executado por uma threadde cada vezpode ser indicado um nume $OMP CRITICAL (¡nome¿)secoes crıticas sem nome sao tratadas como se tivessem o mesmo nome

14 / 28

Page 15: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

15/28

Programacao com OpenMP

I !$OMP DO (!$OMP END DO)

usado para delimitar um trecho de codigo composto da iteracao doloop DO.Os indices do loop sao divididos igualmente entre as threads.A variavel de controle do loop (step) e defida por padrao comoPRIVATE.Pode ser utilizado !$OMP PARALLEL DO (e o END equivalente) parainiciar uma secao paralela e o laco de repeticao juntos.

I !$OMP SECTIONS (!$OMP END SECTIONS)

Utilizado para executar tarefas direrentes em paralelo, cada tarefadelimitada entre um par de diretivas !$OMP SECTION.

15 / 28

Page 16: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

16/28

Programacao com OpenMP

I Exemplo do uso de !$OMP DO e !$OMP CRITICAL

16 / 28

Page 17: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

17/28

MPI

I Padrao para troca de mensagens

I Memoria distribuıda

I Proposta em 1992 em um workshop no Centro de Pesquisa emComputacao Paralela de Williamsburg

I Utiliza troca de mensagens para comunicacao entre processos

17 / 28

Page 18: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

18/28

Programacao com MPI

I Compilando em Fortran com MPI

18 / 28

Page 19: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

19/28

Programacao com MPI

I Conceitos MPI

Processos MPI: rankOrganizados em gruposDados e Envelope

dados = endereco de memoria a ser enviado/recebidoenvelope = identificacao do processo enviado/recebido + o assunto damensagem + comunicador associado.

19 / 28

Page 20: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

20/28

Programacao com MPI

I MPI INIT(mpierr): Inicializa o MPI;

I MPI COMM RANK(comm, rank, mpierr): Obtem o Rank doProcesso

I MPI COMM SIZE(comm, procs, mpierr): Obtem a quantidade deProcessos em execucao

I MPI SEND(msg, count, datatype, dest, tag, comm, mpierr): Enviauma mensagem

I MPI RECEIVE(msg, count, datatype, dest, tag, comm, status,mpierr): Recebe uma mensagem

I MPI FINALIZE(mpierr): Finaliza o MPI.

20 / 28

Page 21: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

21/28

Programacao com MPI

21 / 28

Page 22: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

22/28

Enviando e recebendo mensagens

I MPI RECV(recebe, 1, MPI INTEGER, i, tag, MPI COMM WORLD,status, ierr)

I MPI SEND(envia, 1, MPI INTEGER,i, tag, MPI COMM WORLD,ierr)

I legenda:

envia/recebe = posicao inicial do buffer1 = tamanho do bufferMPI INTEGER = tipo de dado a ser enviadoi = rank que ira receber/mandar a mensagemtag = identificador da mensagemMPI COMM WORLD = comunicadorierr = var. auxiliar (sucesso/falha)

22 / 28

Page 23: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

23/28

Enviando e recebendo mensagens - Exemplo

23 / 28

Page 24: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

24/28

Relacao dos tipos de dados MPI com Fortran

Tipo Dado MPI Tipo dado Fortran

MPI INTEGER INTEGER

MPI REAL REAL

MPI COMPLEX COMPLEX

MPI LOGICAL LOGICAL

MPI CHARACTER CHARACTER(1)

MPI BYTE

MPI PACKED

24 / 28

Page 25: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

25/28

Usando coringas

I MPI RECV(recebe, 1, MPI INTEGER, MPI ANY SOURCE,MPI ANY TAG, MPI COMM WORLD, status, ierr)

I status(MPI SOURCE)

I status(MPI TAG)

I legenda:

MPI ANY SOURCE: pode ser qualquer origemMPI ANY TAG: pode ser qualquer tagstatus(MPI SOURCE): identifica a orgigem da mensagem recebidastatus(MPI TAG) : identifica o assunto da mensagem recebida

25 / 28

Page 26: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

26/28

Comunicando conjuntos de dados

I MPI SEND(vet(ind), parte, MPI INTEGER, MPI ANY SOURCE,tag, MPI COMM WORLD, ierr)

I MPI RECV(vet, parte, MPI INTEGER, i, tag, MPI COMM WORLD,status, ierr)

I legenda:

vet(ind)= posicao inicial do vetorparte = elementos a serem comunicadosMPI INTEGER = tipo de dado a ser enviadoi = rank que ira receber/mandar a mensagemtag = identificador da mensagemMPI COMM WORLD = comunicadorierr = var. auxiliar (sucesso/falha)vet = posicao de recebimento (ind = 0)

26 / 28

Page 27: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

27/28

Comunicando conjuntos de dados - Exemplo

27 / 28

Page 28: Introdução à programação paralela em Fortran usando OpenMP ... · OMP GET NUM THREADS() Retorna o numero de threads utilizadas em uma se˘c~ao paralela OMP GET MAX THREADS()

28/28

Consideracoes Finais

I Uso de OpenMP e MPI em Fortan e simples e direto

I Programadores podem ‘facilmente’ explorar o paralelismo em seusprogramas

I Estudos adicionais

Operacoes de reducao global em OpenMP e MPIComunicacao de grupo e assincronas em MPI...

28 / 28


Recommended