introdução ao processamento de alto desempenho (pad)stephan/cursopad-4.pdf · introdução ao...
TRANSCRIPT
Introdução ao Processamento de Alto
Desempenho (PAD)
Celso L. Mendes / Stephan StephanyLAC /INPE
Email: [email protected]
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)
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)
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)
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)
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)
Exemplo com Pthreads
7Introdução ao Processamento de Alto Desempenho – PAD
Celso L. Mendes (LAC/INPE)
Exemplo com Pthreads (cont.)
8
variável global
Introdução ao Processamento de Alto Desempenho – PADCelso L. Mendes (LAC/INPE)
Exemplo com Pthreads (cont.)
9
variável privativa do thread
Introdução ao Processamento de Alto Desempenho – PADCelso L. Mendes (LAC/INPE)
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)
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)
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)
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
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)
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)
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)
• 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
• 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
• 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.)
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
• 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
• 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
• 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
. . .
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
• 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
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
• 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.)
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)
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)