introdução ao processamento de alto desempenho (pad)stephan/cursopad-4.pdf · introdução ao...

29
Introdução ao Processamento de Alto Desempenho (PAD) Celso L. Mendes / Stephan Stephany LAC /INPE Email: [email protected]

Upload: others

Post on 12-Aug-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Introdução ao Processamento de Alto

Desempenho (PAD)

Celso L. Mendes / Stephan StephanyLAC /INPE

Email: [email protected]

Page 2: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Estrutura do Minicurso • 4 aulas em 3 dias

• 18-19-20 fevereiro 2020 10:20hs – 12:00hs• Material: notas de aula, capítulo do livro, referências• Material auxiliar de apoio: www.lac.inpe.br/~celso/elac19

• Instrutor: Stephan Stephany • Email: [email protected] ([email protected])• LAC, sala 12, fone 3208-6548• Currículo Lattes: http://lattes.cnpq.br/9051364483671452• Currículo Lattes: http://lattes.cnpq.br/1446664587151293

2Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 3: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Estrutura do Minicurso • Aula 4

5. Programação em PADi. Programação em Ambiente de Memória Compartilhada

a. Pthreads

b. OpenMP

ii. Programação em Ambiente de Memória Distribuídaa. Troca de Mensagens com MPI

b. Programação Híbrida

c. Linguagens PGAS

iii. Programação de Aceleradores

6. Tendências para o Futuro

3Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 4: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Programação em PAD• Inúmeros paradigmas

• Maior parte é de interesse acadêmico apenas• Maturidade do ambiente de software é importante

• Muitas aplicações atravessam várias gerações de sistemas

• Linguagens mais utilizadas• C e Fortran• C++ com boa presença; Python ganhando espaço• Extensões das linguagens acima• DSL: Domain-Specific Language – voltadas para alguns domínios

4Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 5: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Programação em Mem.Compartilhada

• Objetivo: explorar todas as CPUs, minimizando o overhead de comunicação entre elas

• Paradigma preferencial: um thread em cada CPU• thread = fluxo de instruções, com registros e pilha próprios• Prog.: um único processo• Alocação thread/CPU

é feita pelo Sist.Operac.• Comunicação via

memória comum

5Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 6: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Programação com Pthreads

• Pthreads: POSIX threads• Padrão POSIX, mais de 100 funções definidas• Criação de threads, encerramento, sincronização, etc.• Interface para programas em C apenas• Todas as funções: pthread_<nome>• Arquivo a ser incluído: pthread.h• Compilação/link: gcc –o prog prog.c –lpthread

• Invoca biblioteca libpthread.a• Disponível em quase todos os sistemas do tipo Unix

6Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 7: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Exemplo com Pthreads

7Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 8: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Exemplo com Pthreads (cont.)

8

variável global

Introdução ao Processamento de Alto Desempenho – PADCelso L. Mendes (LAC/INPE)

Page 9: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Exemplo com Pthreads (cont.)

9

variável privativa do thread

Introdução ao Processamento de Alto Desempenho – PADCelso L. Mendes (LAC/INPE)

Page 10: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Exemplo com Pthreads (cont.)

• Execução:

10

==> Este e' o thread 0 de um total de 4==> Este e' o thread 1 de um total de 4==> Este e' o thread 2 de um total de 4==> Este e' o thread 3 de um total de 4Este e' o thread principal

Introdução ao Processamento de Alto Desempenho – PADCelso L. Mendes (LAC/INPE)

Page 11: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Programação com OpenMP

• Principais motivações:• Passar o gerenciamento de threads para o compilador• Simplificar a programação e migração de programas

• OpenMP:• Padrão definido pelo fórum OpenMP, década de 90• Baseado em dois componentes:

1. Diretivas inseridas no código-fonte

2. Biblioteca com funções de apoio

• Disponível para programas em C e Fortran

11Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 12: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Exemplo com OpenMP

12

diretiva inserida no código

função da biblioteca OpenMP

Introdução ao Processamento de Alto Desempenho – PADCelso L. Mendes (LAC/INPE)

Page 13: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Exemplo com OpenMP (cont.)

• Principais características:• Compiladores podem ignorar as diretivas• Número de threads pode ser definido com variável ambiental

OMP_NUM_THREADS• Cada thread tem um identificador: 0, 1, 2,…

• thread principal sempre existe, e tem identificador = 0• identificador pode ser recuperado com omp_get_thread_num()

• É possível requerer que variáveis globais sejam privatizadas• implementado através de anotação extra na diretiva

13

Page 14: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Exemplo com OpenMP (cont.)

• Escopo das diretivas• Bloco básico imediatamente posterior

• Conjunto de instruções com entrada única e saída única

• Encarado como região paralela• Cada instância da região é executada por um thread

• Se região é um laço: iterações são distribuídas pelos threads• Distribuição em bloco: {i=0,1},{i=2,3},{i=4,5},{i=6,7}• Distribuição cíclica: {i=0,4},{i=1,5},{i=2,6},{i=3,7}• Outras formas de distribuição são possíveis

14Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 15: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

OpenMP - Resumo• Principais vantagens

• Simplificação da programação em relação a Pthreads • Permite paralelização “incremental” de programas antigos• Padrão maduro – duas décadas de amadurecimento• Quase todos os compiladores atuais suportam o padrão• Fórum ainda ativo – novas versões em discussão

• Mais informações: www.openmp.org

15Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 16: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Programação em Mem.Distribuída

• Objetivo: explorar todas as CPUs, com overhead de comunicação entre elas tolerável

• Paradigma preferencial: troca de mensagens entre CPUs• Um ou mais processos por nó• Mensagem entre processos• Participação necessária do

Sistema Operacional

16Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 17: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

• Situação original:• Cada fabricante fornecia sua biblioteca de troca de mensagens• Mudança de plataforma sempre exigia ajustes no código

• Padronização: Message-Passing Interface (MPI)• Fórum MPI criado na década de 90: indústria, labs, universidades• Padronização da interface (biblioteca) para mensagens• Especificação para Fortran, C e C++ (C++ não é suportada hoje)• Implementação modelo: MPICH (Argonne National Lab - EUA)

• Código totalmente aberto, com documentação, etc (www.mpich.org)• Licenciada por diversos fabricantes

• Forte adesão de toda a comunidade

17Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Troca de Mensagens - MPI

Page 18: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

• Seis funções canônicas:• MPI_Init(): inicialização da biblioteca• MPI_Finalize(): encerramento da biblioteca• MPI_Comm_size(): retorna número de processos• MPI_Comm_rank(): retorna identificador (rank)• MPI_Send(): envia mensagem• MPI_Recv(): recebe mensagemÉ possível escrever ~99% dos programas MPI com isto!(porém com pouca eficiência em alguns casos)

18Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

MPI

Page 19: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

• Cada processo tem um identificador (rank: 0,1,2,…)

• Funções ponto-a-ponto: 2 elementos envolvidos• Exemplos: MPI_Send(), MPI_Recv()

• Funções coletivas: Todos os elementos são envolvidos • Exemplos: MPI_Bcast(), MPI_Reduce(), MPI_Barrier()

• Diferentes tipos de funções de envio/recebimento• síncrono × assíncrono• {com × sem} bloqueio

19Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

MPI (cont.)

Page 20: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

20Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

inicializações

executado pelo rank 1

executado pelo rank 0

Programa:rank 1 rank 0rank 0 rank 1

espera por todos os ranks

Exemplo com MPI

Page 21: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

• Idéia:• Usar ranks MPI em diferentes nós• Usar threads OpenMP nos processadores de um nó

• Uso Típico:• #ranks/nó × #threads/rank = #CPUs/nó

• Vantagens• Minimização do número de processos MPI• Aproveitamento de todas as CPUs em um nó

• Possíveis problemas• Nem todos os threads podem chamar funções MPI: depende da implementação da

biblioteca MPI• Programação é mais complexa – dois níveis de paralelismo

21Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Programação Híbrida MPI+OpenMP

Page 22: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

• Objetivos:• Elevar o nível de abstração da programação em

multicomputadores• Evitar ter que lidar com troca de mensagens no programa

• Abordagem: linguagens PGAS• Partitioned Global Address Space• Oferecer a cada processador a ilusão de memória global

• Implementações

• CoArray Fortran, Unified Parallel C (UPC), Chapel, X10, Fortress

22Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Linguagens PGAS

Page 23: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

• Princípios:• Todas as memórias fazem parte do espaço de endereços• Para cada processador, uma faixa de endereços é local

(rápida), as outras faixas são remotas (lentas)• ProcK: Mem-K=local (rápida), Mem-j(j≠K)=remotas (lentas)

23Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Linguagens PGAS (cont.)

Mem-1 Mem-2 Mem-3 Mem-4 Mem-N

Proc1 Proc2 Proc3 Proc4 ProcN

endereço

. . .

Page 24: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

24Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Exemplo com CoArray Fortran

Programa Fortran2008

inicializações

co-array

barreira (sincroniza todos os processadores)

Proc 1 faz todo o trabalho

Page 25: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

• ManyCore - Intel Xeon-Phi:• Em cada CPU: código x86 + instruções vetoriais• Em cada chip: OpenMP para os vários núcleos -- até 244 threads!• Múltiplos chips: MPI (combinado com OpenMP em cada chip)

• GPU: duas alternativas concretasa. Diretivas – OpenACC, OpenMPb. Linguagens – OpenCL, CUDA (para GPUs da Nvidia)

• CUDA: extensão de C, com duas modificações1. Declaração de funções (kernels) para a GPU: ___global___ mykernel2. Invocação de kernels: mykernel<<<val1,val2>>>(args)

25Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Programação de Aceleradores

Page 26: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

26Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Exemplo com CUDA

roda na GPU

roda na CPU

4 blocos, 2 threads/bloco

Page 27: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

• Compilação/link:• nvcc –o prog prog.cu

• Execução:

No inicio do Programa Principal

Dentro do Kernel, valor= 9 coords=1,0

Dentro do Kernel, valor=10 coords=1,1

Dentro do Kernel, valor=18 coords=2,0

Dentro do Kernel, valor=19 coords=2,1

Dentro do Kernel, valor=27 coords=3,0

Dentro do Kernel, valor=28 coords=3,1

Dentro do Kernel, valor= 0 coords=0,0

Dentro do Kernel, valor= 1 coords=0,1

No final do Programa Principal

27Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Exemplo com CUDA (cont.)

Page 28: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Tendências para o Futuro

• Sistemas com centenas de PFlops• Próximos 1~2 anos

• Sistemas Exaflop (1018 flops/segundo)• Provavelmente no início da próxima década• Paralelismo: O(1 bilhão) de threads!• Consumo de energia: ? (hoje: GigaWatts!)

• Outras tecnologias a serem observadas• Processadores ARM – baixo consumo, baixo custo• FPGAs – reprogramáveis, ultra-rápidas

28Introdução ao Processamento de Alto Desempenho – PAD

Celso L. Mendes (LAC/INPE)

Page 29: Introdução ao Processamento de Alto Desempenho (PAD)stephan/CursoPAD-4.pdf · Introdução ao Processamento de Alto Desempenho – PAD Celso L. Mendes (LAC/INPE) Exemplo com CUDA

Tendências para o Futuro (cont.)

• Desafios críticos para Exaflop• Modelo de programação: MPI+OpenMP ? MPI+X ? X=? • Veloc. memória × quantidade de memória por processador ?• Consumo de energia: como diminuir Watt/flop ?• Confiabilidade: como lidar com falhas frequentes ?

• Previsão pessoal• PAD cada vez mais influente!

FIM29

Introdução ao Processamento de Alto Desempenho – PADCelso L. Mendes (LAC/INPE)