Introdução à Programação Paralela com MPI - if/ufrgs

174
Introdução à Programação Paralela com MPI Guilherme Gonçalves Ferrari 1 Departamento de Astronomia Instituto de Física - UFRGS 1 [email protected] Porto Alegre Junho de 2010

Transcript of Introdução à Programação Paralela com MPI - if/ufrgs

Introdução à Programação Paralela com MPI

Guilherme Gonçalves Ferrari1

Departamento de AstronomiaInstituto de Física - UFRGS

[email protected]

Porto AlegreJunho de 2010

Sumário

1 IntroduçãoAntes, Durante e Depois da Paralelização...Modelos/Arquiteturas de Programação ParalelaParalelismo Implícito vs ExplícitoModelos de ComunicaçãoO que é MPI?Razões para usar MPI

2 Programando com MPIEstrutura de um Programa MPICompilando e Executando Programa MPIComunicadoresFunções Básicas de Inicialização e FinalizaçãoRotinas Básicas de Comunicação

3 Links Úteis

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 2 / 40

Sumário

1 IntroduçãoAntes, Durante e Depois da Paralelização...Modelos/Arquiteturas de Programação ParalelaParalelismo Implícito vs ExplícitoModelos de ComunicaçãoO que é MPI?Razões para usar MPI

2 Programando com MPIEstrutura de um Programa MPICompilando e Executando Programa MPIComunicadoresFunções Básicas de Inicialização e FinalizaçãoRotinas Básicas de Comunicação

3 Links Úteis

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 2 / 40

Sumário

1 IntroduçãoAntes, Durante e Depois da Paralelização...Modelos/Arquiteturas de Programação ParalelaParalelismo Implícito vs ExplícitoModelos de ComunicaçãoO que é MPI?Razões para usar MPI

2 Programando com MPIEstrutura de um Programa MPICompilando e Executando Programa MPIComunicadoresFunções Básicas de Inicialização e FinalizaçãoRotinas Básicas de Comunicação

3 Links Úteis

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 2 / 40

Sumário

1 IntroduçãoAntes, Durante e Depois da Paralelização...Modelos/Arquiteturas de Programação ParalelaParalelismo Implícito vs ExplícitoModelos de ComunicaçãoO que é MPI?Razões para usar MPI

2 Programando com MPIEstrutura de um Programa MPICompilando e Executando Programa MPIComunicadoresFunções Básicas de Inicialização e FinalizaçãoRotinas Básicas de Comunicação

3 Links Úteis

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 3 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Antes da Paralelização...Investir no desempenho do código serialProgramação atenta ao desempenhoOtimizações para acelerar o código

Durante a Paralelização...Que estratégia utilizar na divisão em tarefas paralelas?Programador serial tem dificuldade de migrar para outro modeloConhecimento de paralelismo é pouco difundidoPensar em paralelo é difícil

Depois da Paralelização...EscalonamentoBalanceamento de CargaRemover gargalos

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 4 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Modelos/Arquiteturas de Programação ParalelaSISD: Single Instruction - Single Data

Arquitetura sequencialCPU

MISD: Multiple Instruction - Single DataArquitetura incomumGeralmente utilizada em sistemas com tolerância a falhasp.ex.: controle de ônibus espaciais

SIMD: Single Instruction - Multiple DataArquitetura vetorialGPUs

MIMD: Multiple Instruction - Multiple DataSistemas distribuídosCada processador executa um processo paraleloVariantes:

MPMD: Multiple Program - Multiple DataSPMD: Single Program - Multiple Data → modelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 5 / 40

Introdução

Paralelismo Implícito vs ExplícitoImplícito:

Exploração automática do paralelismoCompilador gera operações paralelasp.ex.: High Performance Fortran (HPF);

Compiladores da Intel (parcialmente);Explícito:

Programador explicita o paralelismoLinguagens próprias para paralelismo (p.ex.: Charm++)Linguagens sequenciais (C, C++, Fortran, Python) com bibliotecas oudiretivas para paralelismo (MPI, OpenMP, PVM)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 6 / 40

Introdução

Paralelismo Implícito vs ExplícitoImplícito:

Exploração automática do paralelismoCompilador gera operações paralelasp.ex.: High Performance Fortran (HPF);

Compiladores da Intel (parcialmente);Explícito:

Programador explicita o paralelismoLinguagens próprias para paralelismo (p.ex.: Charm++)Linguagens sequenciais (C, C++, Fortran, Python) com bibliotecas oudiretivas para paralelismo (MPI, OpenMP, PVM)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 6 / 40

Introdução

Paralelismo Implícito vs ExplícitoImplícito:

Exploração automática do paralelismoCompilador gera operações paralelasp.ex.: High Performance Fortran (HPF);

Compiladores da Intel (parcialmente);Explícito:

Programador explicita o paralelismoLinguagens próprias para paralelismo (p.ex.: Charm++)Linguagens sequenciais (C, C++, Fortran, Python) com bibliotecas oudiretivas para paralelismo (MPI, OpenMP, PVM)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 6 / 40

Introdução

Paralelismo Implícito vs ExplícitoImplícito:

Exploração automática do paralelismoCompilador gera operações paralelasp.ex.: High Performance Fortran (HPF);

Compiladores da Intel (parcialmente);Explícito:

Programador explicita o paralelismoLinguagens próprias para paralelismo (p.ex.: Charm++)Linguagens sequenciais (C, C++, Fortran, Python) com bibliotecas oudiretivas para paralelismo (MPI, OpenMP, PVM)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 6 / 40

Introdução

Paralelismo Implícito vs ExplícitoImplícito:

Exploração automática do paralelismoCompilador gera operações paralelasp.ex.: High Performance Fortran (HPF);

Compiladores da Intel (parcialmente);Explícito:

Programador explicita o paralelismoLinguagens próprias para paralelismo (p.ex.: Charm++)Linguagens sequenciais (C, C++, Fortran, Python) com bibliotecas oudiretivas para paralelismo (MPI, OpenMP, PVM)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 6 / 40

Introdução

Paralelismo Implícito vs ExplícitoImplícito:

Exploração automática do paralelismoCompilador gera operações paralelasp.ex.: High Performance Fortran (HPF);

Compiladores da Intel (parcialmente);Explícito:

Programador explicita o paralelismoLinguagens próprias para paralelismo (p.ex.: Charm++)Linguagens sequenciais (C, C++, Fortran, Python) com bibliotecas oudiretivas para paralelismo (MPI, OpenMP, PVM)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 6 / 40

Introdução

Paralelismo Implícito vs ExplícitoImplícito:

Exploração automática do paralelismoCompilador gera operações paralelasp.ex.: High Performance Fortran (HPF);

Compiladores da Intel (parcialmente);Explícito:

Programador explicita o paralelismoLinguagens próprias para paralelismo (p.ex.: Charm++)Linguagens sequenciais (C, C++, Fortran, Python) com bibliotecas oudiretivas para paralelismo (MPI, OpenMP, PVM)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 6 / 40

Introdução

Paralelismo Implícito vs ExplícitoImplícito:

Exploração automática do paralelismoCompilador gera operações paralelasp.ex.: High Performance Fortran (HPF);

Compiladores da Intel (parcialmente);Explícito:

Programador explicita o paralelismoLinguagens próprias para paralelismo (p.ex.: Charm++)Linguagens sequenciais (C, C++, Fortran, Python) com bibliotecas oudiretivas para paralelismo (MPI, OpenMP, PVM)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 6 / 40

Introdução

Modelos de ComunicaçãoMemória Compartilhada

Mais simplesTroca de dados implícitaModelo usado pelo OpenPM

Memória Distribuída - Troca de MensagensMais complicadoProgramador deve orquestrar toda a troca de dadosModelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 7 / 40

Introdução

Modelos de ComunicaçãoMemória Compartilhada

Mais simplesTroca de dados implícitaModelo usado pelo OpenPM

Memória Distribuída - Troca de MensagensMais complicadoProgramador deve orquestrar toda a troca de dadosModelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 7 / 40

Introdução

Modelos de ComunicaçãoMemória Compartilhada

Mais simplesTroca de dados implícitaModelo usado pelo OpenPM

Memória Distribuída - Troca de MensagensMais complicadoProgramador deve orquestrar toda a troca de dadosModelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 7 / 40

Introdução

Modelos de ComunicaçãoMemória Compartilhada

Mais simplesTroca de dados implícitaModelo usado pelo OpenPM

Memória Distribuída - Troca de MensagensMais complicadoProgramador deve orquestrar toda a troca de dadosModelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 7 / 40

Introdução

Modelos de ComunicaçãoMemória Compartilhada

Mais simplesTroca de dados implícitaModelo usado pelo OpenPM

Memória Distribuída - Troca de MensagensMais complicadoProgramador deve orquestrar toda a troca de dadosModelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 7 / 40

Introdução

Modelos de ComunicaçãoMemória Compartilhada

Mais simplesTroca de dados implícitaModelo usado pelo OpenPM

Memória Distribuída - Troca de MensagensMais complicadoProgramador deve orquestrar toda a troca de dadosModelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 7 / 40

Introdução

Modelos de ComunicaçãoMemória Compartilhada

Mais simplesTroca de dados implícitaModelo usado pelo OpenPM

Memória Distribuída - Troca de MensagensMais complicadoProgramador deve orquestrar toda a troca de dadosModelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 7 / 40

Introdução

Modelos de ComunicaçãoMemória Compartilhada

Mais simplesTroca de dados implícitaModelo usado pelo OpenPM

Memória Distribuída - Troca de MensagensMais complicadoProgramador deve orquestrar toda a troca de dadosModelo usado pelo MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 7 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

O que é MPI?MPI = Message Passing InterfaceEspecificação de uma biblioteca padrão para troca de mensagens

Não é linguagem ou compiladorHistórico:

Início: Supercomputing 1992Empresas: IBM, Cray, IntelAplicações: Laboratórios, Universidades1995: MPI-1.11997: MPI-1.21998: MPI-2

Principais Implementações:MPICH - Argonne National Laboratory (www.mcs.anl.gov/mpi/mpich/)LAM-MPI - Ohio Supercomputing Center (www.lam-mpi.org/)OpenMPI - Consórcio (www.open-mpi.org/)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 8 / 40

Introdução

Razões para usar MPIPadronização: MPI é um “padrão por consenso”Funcionalidade: mais de 300 rotinasDisponibilidade: virtualmente todas as plataformasPortabilidade: não necessita alterar o código para cada plataformaEscalabilidadePerformance

Instalação MPINo Ubuntu: sudo apt-get install mpi-default-bin mpi-default-devIsso vai instalar o OpenMPI → mais recomendada atualmente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 9 / 40

Introdução

Razões para usar MPIPadronização: MPI é um “padrão por consenso”Funcionalidade: mais de 300 rotinasDisponibilidade: virtualmente todas as plataformasPortabilidade: não necessita alterar o código para cada plataformaEscalabilidadePerformance

Instalação MPINo Ubuntu: sudo apt-get install mpi-default-bin mpi-default-devIsso vai instalar o OpenMPI → mais recomendada atualmente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 9 / 40

Introdução

Razões para usar MPIPadronização: MPI é um “padrão por consenso”Funcionalidade: mais de 300 rotinasDisponibilidade: virtualmente todas as plataformasPortabilidade: não necessita alterar o código para cada plataformaEscalabilidadePerformance

Instalação MPINo Ubuntu: sudo apt-get install mpi-default-bin mpi-default-devIsso vai instalar o OpenMPI → mais recomendada atualmente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 9 / 40

Introdução

Razões para usar MPIPadronização: MPI é um “padrão por consenso”Funcionalidade: mais de 300 rotinasDisponibilidade: virtualmente todas as plataformasPortabilidade: não necessita alterar o código para cada plataformaEscalabilidadePerformance

Instalação MPINo Ubuntu: sudo apt-get install mpi-default-bin mpi-default-devIsso vai instalar o OpenMPI → mais recomendada atualmente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 9 / 40

Introdução

Razões para usar MPIPadronização: MPI é um “padrão por consenso”Funcionalidade: mais de 300 rotinasDisponibilidade: virtualmente todas as plataformasPortabilidade: não necessita alterar o código para cada plataformaEscalabilidadePerformance

Instalação MPINo Ubuntu: sudo apt-get install mpi-default-bin mpi-default-devIsso vai instalar o OpenMPI → mais recomendada atualmente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 9 / 40

Introdução

Razões para usar MPIPadronização: MPI é um “padrão por consenso”Funcionalidade: mais de 300 rotinasDisponibilidade: virtualmente todas as plataformasPortabilidade: não necessita alterar o código para cada plataformaEscalabilidadePerformance

Instalação MPINo Ubuntu: sudo apt-get install mpi-default-bin mpi-default-devIsso vai instalar o OpenMPI → mais recomendada atualmente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 9 / 40

Introdução

Razões para usar MPIPadronização: MPI é um “padrão por consenso”Funcionalidade: mais de 300 rotinasDisponibilidade: virtualmente todas as plataformasPortabilidade: não necessita alterar o código para cada plataformaEscalabilidadePerformance

Instalação MPINo Ubuntu: sudo apt-get install mpi-default-bin mpi-default-devIsso vai instalar o OpenMPI → mais recomendada atualmente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 9 / 40

Introdução

Razões para usar MPIPadronização: MPI é um “padrão por consenso”Funcionalidade: mais de 300 rotinasDisponibilidade: virtualmente todas as plataformasPortabilidade: não necessita alterar o código para cada plataformaEscalabilidadePerformance

Instalação MPINo Ubuntu: sudo apt-get install mpi-default-bin mpi-default-devIsso vai instalar o OpenMPI → mais recomendada atualmente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 9 / 40

Introdução

Razões para usar MPIPadronização: MPI é um “padrão por consenso”Funcionalidade: mais de 300 rotinasDisponibilidade: virtualmente todas as plataformasPortabilidade: não necessita alterar o código para cada plataformaEscalabilidadePerformance

Instalação MPINo Ubuntu: sudo apt-get install mpi-default-bin mpi-default-devIsso vai instalar o OpenMPI → mais recomendada atualmente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 9 / 40

Introdução

Razões para usar MPIPadronização: MPI é um “padrão por consenso”Funcionalidade: mais de 300 rotinasDisponibilidade: virtualmente todas as plataformasPortabilidade: não necessita alterar o código para cada plataformaEscalabilidadePerformance

Instalação MPINo Ubuntu: sudo apt-get install mpi-default-bin mpi-default-devIsso vai instalar o OpenMPI → mais recomendada atualmente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 9 / 40

Sumário

1 IntroduçãoAntes, Durante e Depois da Paralelização...Modelos/Arquiteturas de Programação ParalelaParalelismo Implícito vs ExplícitoModelos de ComunicaçãoO que é MPI?Razões para usar MPI

2 Programando com MPIEstrutura de um Programa MPICompilando e Executando Programa MPIComunicadoresFunções Básicas de Inicialização e FinalizaçãoRotinas Básicas de Comunicação

3 Links Úteis

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 10 / 40

Programando com MPI

Estrutura de um Programa MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 11 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

Compilando e Executando Programa MPICompilar com:

C: mpicc codigo.c -o programC++: mpic++ codigo.cpp -o programFortran: mpif77 codigo.f -o program...mpicc -showme ⇒ gcc -I/usr/lib/lam/include -pthread-Wl,-Bsymbolic-functions -L/usr/lib/lam/lib -llammpio -llamf77mpi -lmpi-llam -lutil -ldl

Em Python:Não precisa compilar, mas tem que usar módulo extraEu recomendo “mpi4py” → Importante: segue especificações de C/C++Requer:

Python (óbvio) versão 2.3/2.4/2.5/2.6/2.7/3.0/3.1/3.2Uma implementação MPI previamente instalada

Executar com:C/C++/Fortran: mpiexec -n 5 ./program [args]Python: mpiexec -n 5 python program.py [args]

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 12 / 40

Programando com MPI

ComunicadoresComunicador: universo de processos envolvidos em uma comunicaçãoMPI_COMM_WORLD - Comunicador padrãoInclui todos os processosMPI permite criação de novos comunicadores definidos por

Grupo: conjunto ordenado de processosContexto: tag de uma mensagem

Processos do mesmo grupo e usando o mesmo contexto podem secomunicar

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 13 / 40

Programando com MPI

ComunicadoresComunicador: universo de processos envolvidos em uma comunicaçãoMPI_COMM_WORLD - Comunicador padrãoInclui todos os processosMPI permite criação de novos comunicadores definidos por

Grupo: conjunto ordenado de processosContexto: tag de uma mensagem

Processos do mesmo grupo e usando o mesmo contexto podem secomunicar

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 13 / 40

Programando com MPI

ComunicadoresComunicador: universo de processos envolvidos em uma comunicaçãoMPI_COMM_WORLD - Comunicador padrãoInclui todos os processosMPI permite criação de novos comunicadores definidos por

Grupo: conjunto ordenado de processosContexto: tag de uma mensagem

Processos do mesmo grupo e usando o mesmo contexto podem secomunicar

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 13 / 40

Programando com MPI

ComunicadoresComunicador: universo de processos envolvidos em uma comunicaçãoMPI_COMM_WORLD - Comunicador padrãoInclui todos os processosMPI permite criação de novos comunicadores definidos por

Grupo: conjunto ordenado de processosContexto: tag de uma mensagem

Processos do mesmo grupo e usando o mesmo contexto podem secomunicar

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 13 / 40

Programando com MPI

ComunicadoresComunicador: universo de processos envolvidos em uma comunicaçãoMPI_COMM_WORLD - Comunicador padrãoInclui todos os processosMPI permite criação de novos comunicadores definidos por

Grupo: conjunto ordenado de processosContexto: tag de uma mensagem

Processos do mesmo grupo e usando o mesmo contexto podem secomunicar

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 13 / 40

Programando com MPI

ComunicadoresComunicador: universo de processos envolvidos em uma comunicaçãoMPI_COMM_WORLD - Comunicador padrãoInclui todos os processosMPI permite criação de novos comunicadores definidos por

Grupo: conjunto ordenado de processosContexto: tag de uma mensagem

Processos do mesmo grupo e usando o mesmo contexto podem secomunicar

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 13 / 40

Programando com MPI

ComunicadoresComunicador: universo de processos envolvidos em uma comunicaçãoMPI_COMM_WORLD - Comunicador padrãoInclui todos os processosMPI permite criação de novos comunicadores definidos por

Grupo: conjunto ordenado de processosContexto: tag de uma mensagem

Processos do mesmo grupo e usando o mesmo contexto podem secomunicar

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 13 / 40

Programando com MPI

ComunicadoresComunicador: universo de processos envolvidos em uma comunicaçãoMPI_COMM_WORLD - Comunicador padrãoInclui todos os processosMPI permite criação de novos comunicadores definidos por

Grupo: conjunto ordenado de processosContexto: tag de uma mensagem

Processos do mesmo grupo e usando o mesmo contexto podem secomunicar

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 13 / 40

Programando com MPI

Comunicadores

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 14 / 40

Programando com MPI

Funções Básicas de Inicialização e FinalizaçãoMPI_Init - Inicializa processos MPIMPI_Comm_size - Determina o número de processos no comunicadorMPI_Comm_rank - Determina o rank de um processo no comunicadorMPI_Get_processor_name - Determina o nome do processadorMPI_Abort - Termina todos os processos MPI dentro de um comunicadorMPI_Initialized - Indica se MPI_Init já foi chamadoMPI_Wtime - Retorna o wall clock time em segundosMPI_Wtick - Retorna a resolução em segundos de MPI_WtimeMPI_Finalize - Finaliza o ambiente de execução MPI

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 15 / 40

Programando com MPI

Primeiros Exemplos

Hello World - v1

#include <mpi.h>#include <stdio.h>

int main(int argc , char **argv){

MPI_Init (&argc , &argv);printf("Hello world !\n");MPI_Finalize ();return 0;

}

Hello World - v1.1

#include <mpi.h>#include <stdio.h>

int main(int argc , char **argv){

printf("Antes ...\n"); /* <-- */MPI_Init (&argc , &argv);printf("Hello world !\n");MPI_Finalize ();printf("Depois ...\n"); /* <-- */return 0;

}

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 16 / 40

Programando com MPI

Hello World - v2

#include <mpi.h>#include <stdio.h>

int main(int argc , char **argv){

int rank , size , nlen;char name[MPI_MAX_PROCESSOR_NAME ];MPI_Init (&argc , &argv);MPI_Comm_rank(MPI_COMM_WORLD , &rank); /* get rank */MPI_Comm_size(MPI_COMM_WORLD , &size); /* get size */MPI_Get_processor_name(name , &nlen); /* get name */printf("Hello world! I am process %d out of %d on %s\n",

rank , size , name);MPI_Finalize ();return 0;

}

Diferenciando tarefas através de rankif rank == 0 faça issoif rank == 1 faça aquilo...

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 17 / 40

Programando com MPI

Hello World - v2

#include <mpi.h>#include <stdio.h>

int main(int argc , char **argv){

int rank , size , nlen;char name[MPI_MAX_PROCESSOR_NAME ];MPI_Init (&argc , &argv);MPI_Comm_rank(MPI_COMM_WORLD , &rank); /* get rank */MPI_Comm_size(MPI_COMM_WORLD , &size); /* get size */MPI_Get_processor_name(name , &nlen); /* get name */printf("Hello world! I am process %d out of %d on %s\n",

rank , size , name);MPI_Finalize ();return 0;

}

Diferenciando tarefas através de rankif rank == 0 faça issoif rank == 1 faça aquilo...

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 17 / 40

Programando com MPI

Hello World - v2

#include <mpi.h>#include <stdio.h>

int main(int argc , char **argv){

int rank , size , nlen;char name[MPI_MAX_PROCESSOR_NAME ];MPI_Init (&argc , &argv);MPI_Comm_rank(MPI_COMM_WORLD , &rank); /* get rank */MPI_Comm_size(MPI_COMM_WORLD , &size); /* get size */MPI_Get_processor_name(name , &nlen); /* get name */printf("Hello world! I am process %d out of %d on %s\n",

rank , size , name);MPI_Finalize ();return 0;

}

Diferenciando tarefas através de rankif rank == 0 faça issoif rank == 1 faça aquilo...

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 17 / 40

Programando com MPI

Hello World - v2

#include <mpi.h>#include <stdio.h>

int main(int argc , char **argv){

int rank , size , nlen;char name[MPI_MAX_PROCESSOR_NAME ];MPI_Init (&argc , &argv);MPI_Comm_rank(MPI_COMM_WORLD , &rank); /* get rank */MPI_Comm_size(MPI_COMM_WORLD , &size); /* get size */MPI_Get_processor_name(name , &nlen); /* get name */printf("Hello world! I am process %d out of %d on %s\n",

rank , size , name);MPI_Finalize ();return 0;

}

Diferenciando tarefas através de rankif rank == 0 faça issoif rank == 1 faça aquilo...

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 17 / 40

Programando com MPI

Hello World - v2

#include <mpi.h>#include <stdio.h>

int main(int argc , char **argv){

int rank , size , nlen;char name[MPI_MAX_PROCESSOR_NAME ];MPI_Init (&argc , &argv);MPI_Comm_rank(MPI_COMM_WORLD , &rank); /* get rank */MPI_Comm_size(MPI_COMM_WORLD , &size); /* get size */MPI_Get_processor_name(name , &nlen); /* get name */printf("Hello world! I am process %d out of %d on %s\n",

rank , size , name);MPI_Finalize ();return 0;

}

Diferenciando tarefas através de rankif rank == 0 faça issoif rank == 1 faça aquilo...

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 17 / 40

Programando com MPI

Hello World - v2.1

#include <mpi.h>#include <stdio.h>

#define ROOT 0

int main(int argc , char **argv){

int rank , size , nlen;char name[MPI_MAX_PROCESSOR_NAME ];MPI_Init (&argc , &argv);MPI_Comm_rank(MPI_COMM_WORLD , &rank); /* get rank */MPI_Comm_size(MPI_COMM_WORLD , &size); /* get size */MPI_Get_processor_name(name , &nlen); /* get name */if (rank == ROOT) {

printf("Hello world! I am process %d out of %d on %s\n",rank , size , name);

} else {printf("Alo mundo! Eu sou o processo %d de %d em %s\n",

rank , size , name);}MPI_Finalize ();return 0;

}

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 18 / 40

Programando com MPI

Comunicação Ponto-a-PontoBloqueante x Não-Bloqueante:

Bloqueante: operação não retorna até que a cópia do buffer do sistematenha completadoNão-Bloqueante: operação retorna imediatamente

Operações não-bloqueantes → sobreposição de comunicação e computação

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 19 / 40

Programando com MPI

Comunicação Ponto-a-PontoBloqueante x Não-Bloqueante:

Bloqueante: operação não retorna até que a cópia do buffer do sistematenha completadoNão-Bloqueante: operação retorna imediatamente

Operações não-bloqueantes → sobreposição de comunicação e computação

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 19 / 40

Programando com MPI

Comunicação Ponto-a-PontoBloqueante x Não-Bloqueante:

Bloqueante: operação não retorna até que a cópia do buffer do sistematenha completadoNão-Bloqueante: operação retorna imediatamente

Operações não-bloqueantes → sobreposição de comunicação e computação

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 19 / 40

Programando com MPI

Comunicação Ponto-a-PontoBloqueante x Não-Bloqueante:

Bloqueante: operação não retorna até que a cópia do buffer do sistematenha completadoNão-Bloqueante: operação retorna imediatamente

Operações não-bloqueantes → sobreposição de comunicação e computação

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 19 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - BloqueanteMPI_Send - Operação básica para enviar uma mensagem

MPI_SsendMPI_BsendMPI_Rsend

MPI_Recv - Operação básica para receber uma mensagemMPI_Sendrecv - Send/Receive simultâneoMPI_Wait - Processo espera uma operação send ou receive terminar

MPI_WaitanyMPI_WaitallMPI_Waitsome

MPI_Probe - Executa um teste bloqueante pela chegada da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 20 / 40

Programando com MPI

Envio/Recebimento Básico - BloqueanteMPI_Send(&buf, count, datatype, dest, tag, comm)MPI_Recv(&buf, count, datatype, source, tag, comm, &status)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Status *status: objeto com informação da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 21 / 40

Programando com MPI

Envio/Recebimento Básico - BloqueanteMPI_Send(&buf, count, datatype, dest, tag, comm)MPI_Recv(&buf, count, datatype, source, tag, comm, &status)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Status *status: objeto com informação da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 21 / 40

Programando com MPI

Envio/Recebimento Básico - BloqueanteMPI_Send(&buf, count, datatype, dest, tag, comm)MPI_Recv(&buf, count, datatype, source, tag, comm, &status)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Status *status: objeto com informação da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 21 / 40

Programando com MPI

Envio/Recebimento Básico - BloqueanteMPI_Send(&buf, count, datatype, dest, tag, comm)MPI_Recv(&buf, count, datatype, source, tag, comm, &status)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Status *status: objeto com informação da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 21 / 40

Programando com MPI

Envio/Recebimento Básico - BloqueanteMPI_Send(&buf, count, datatype, dest, tag, comm)MPI_Recv(&buf, count, datatype, source, tag, comm, &status)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Status *status: objeto com informação da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 21 / 40

Programando com MPI

Envio/Recebimento Básico - BloqueanteMPI_Send(&buf, count, datatype, dest, tag, comm)MPI_Recv(&buf, count, datatype, source, tag, comm, &status)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Status *status: objeto com informação da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 21 / 40

Programando com MPI

Envio/Recebimento Básico - BloqueanteMPI_Send(&buf, count, datatype, dest, tag, comm)MPI_Recv(&buf, count, datatype, source, tag, comm, &status)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Status *status: objeto com informação da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 21 / 40

Programando com MPI

Envio/Recebimento Básico - BloqueanteMPI_Send(&buf, count, datatype, dest, tag, comm)MPI_Recv(&buf, count, datatype, source, tag, comm, &status)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Status *status: objeto com informação da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 21 / 40

Programando com MPI

Envio/Recebimento Básico - BloqueanteMPI_Send(&buf, count, datatype, dest, tag, comm)MPI_Recv(&buf, count, datatype, source, tag, comm, &status)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Status *status: objeto com informação da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 21 / 40

Programando com MPI

Envio/Recebimento Básico - BloqueanteMPI_Send(&buf, count, datatype, dest, tag, comm)MPI_Recv(&buf, count, datatype, source, tag, comm, &status)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Status *status: objeto com informação da mensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 21 / 40

Programando com MPI

Tipos de DadosMPI datatype C datatypeMPI_CHAR signed charMPI_SHORT signed short intMPI_INT signed intMPI_LONG signed long intMPI_UNSIGNED_CHAR unsigned charMPI_UNSIGNED_SHORT unsigned short intMPI_UNSIGNED unsigned intMPI_UNSIGNED_LONG unsigned long intMPI_FLOAT floatMPI_DOUBLE doubleMPI_LONG_DOUBLE long double

MPI permite criar tipos de dados derivadosp.ex.: Struct Derived Data Type

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 22 / 40

Programando com MPI

Exemplo Envio/Recebimento - Bloqueante

#include <mpi.h>#include <stdio.h>

#define ROOT 0#define MSGLEN 100

int main(int argc , char **argv){

int i, rank , size , nlen , tag = 999;char name[MPI_MAX_PROCESSOR_NAME ];char recvmsg[MSGLEN], sendmsg[MSGLEN ];MPI_Status stats;

MPI_Init (&argc , &argv);MPI_Comm_rank(MPI_COMM_WORLD , &rank);MPI_Comm_size(MPI_COMM_WORLD , &size);MPI_Get_processor_name(name , &nlen);

sprintf(sendmsg , "Hello world! I am process %d out of %d on %s\n", rank , size , name);

if (rank == ROOT) {printf("Message from process %d: %s", ROOT , sendmsg);for (i = 1; i < size; ++i) {

MPI_Recv (&recvmsg , MSGLEN , MPI_CHAR , i, tag , MPI_COMM_WORLD , &stats);printf("Message from process %d: %s", i, recvmsg);

}} else {

MPI_Send (&sendmsg , MSGLEN , MPI_CHAR , ROOT , tag , MPI_COMM_WORLD);}

MPI_Finalize ();return 0;

}

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 23 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - Não-BloqueanteMPI_Isend - Operação não-bloqueante para enviar uma mensagem

MPI_IssendMPI_IbsendMPI_Irsend

MPI_Irecv - Operação não-bloqueante para receber uma mensagemMPI_Test - Testa se uma operação send ou receive completou

MPI_TestanyMPI_TestallMPI_Testsome

MPI_Iprobe - Executa um teste não bloqueante pela chegada damensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 24 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - Não-BloqueanteMPI_Isend - Operação não-bloqueante para enviar uma mensagem

MPI_IssendMPI_IbsendMPI_Irsend

MPI_Irecv - Operação não-bloqueante para receber uma mensagemMPI_Test - Testa se uma operação send ou receive completou

MPI_TestanyMPI_TestallMPI_Testsome

MPI_Iprobe - Executa um teste não bloqueante pela chegada damensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 24 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - Não-BloqueanteMPI_Isend - Operação não-bloqueante para enviar uma mensagem

MPI_IssendMPI_IbsendMPI_Irsend

MPI_Irecv - Operação não-bloqueante para receber uma mensagemMPI_Test - Testa se uma operação send ou receive completou

MPI_TestanyMPI_TestallMPI_Testsome

MPI_Iprobe - Executa um teste não bloqueante pela chegada damensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 24 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - Não-BloqueanteMPI_Isend - Operação não-bloqueante para enviar uma mensagem

MPI_IssendMPI_IbsendMPI_Irsend

MPI_Irecv - Operação não-bloqueante para receber uma mensagemMPI_Test - Testa se uma operação send ou receive completou

MPI_TestanyMPI_TestallMPI_Testsome

MPI_Iprobe - Executa um teste não bloqueante pela chegada damensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 24 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - Não-BloqueanteMPI_Isend - Operação não-bloqueante para enviar uma mensagem

MPI_IssendMPI_IbsendMPI_Irsend

MPI_Irecv - Operação não-bloqueante para receber uma mensagemMPI_Test - Testa se uma operação send ou receive completou

MPI_TestanyMPI_TestallMPI_Testsome

MPI_Iprobe - Executa um teste não bloqueante pela chegada damensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 24 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - Não-BloqueanteMPI_Isend - Operação não-bloqueante para enviar uma mensagem

MPI_IssendMPI_IbsendMPI_Irsend

MPI_Irecv - Operação não-bloqueante para receber uma mensagemMPI_Test - Testa se uma operação send ou receive completou

MPI_TestanyMPI_TestallMPI_Testsome

MPI_Iprobe - Executa um teste não bloqueante pela chegada damensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 24 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - Não-BloqueanteMPI_Isend - Operação não-bloqueante para enviar uma mensagem

MPI_IssendMPI_IbsendMPI_Irsend

MPI_Irecv - Operação não-bloqueante para receber uma mensagemMPI_Test - Testa se uma operação send ou receive completou

MPI_TestanyMPI_TestallMPI_Testsome

MPI_Iprobe - Executa um teste não bloqueante pela chegada damensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 24 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - Não-BloqueanteMPI_Isend - Operação não-bloqueante para enviar uma mensagem

MPI_IssendMPI_IbsendMPI_Irsend

MPI_Irecv - Operação não-bloqueante para receber uma mensagemMPI_Test - Testa se uma operação send ou receive completou

MPI_TestanyMPI_TestallMPI_Testsome

MPI_Iprobe - Executa um teste não bloqueante pela chegada damensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 24 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - Não-BloqueanteMPI_Isend - Operação não-bloqueante para enviar uma mensagem

MPI_IssendMPI_IbsendMPI_Irsend

MPI_Irecv - Operação não-bloqueante para receber uma mensagemMPI_Test - Testa se uma operação send ou receive completou

MPI_TestanyMPI_TestallMPI_Testsome

MPI_Iprobe - Executa um teste não bloqueante pela chegada damensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 24 / 40

Programando com MPI

Rotinas Básicas de Comunicação Ponto-a-Ponto - Não-BloqueanteMPI_Isend - Operação não-bloqueante para enviar uma mensagem

MPI_IssendMPI_IbsendMPI_Irsend

MPI_Irecv - Operação não-bloqueante para receber uma mensagemMPI_Test - Testa se uma operação send ou receive completou

MPI_TestanyMPI_TestallMPI_Testsome

MPI_Iprobe - Executa um teste não bloqueante pela chegada damensagem

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 24 / 40

Programando com MPI

Envio/Recebimento Básico - Não-BloqueanteMPI_Isend(&buf, count, datatype, dest, tag, comm, &request)MPI_Irecv(&buf, count, datatype, source, tag, comm, &request)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Request *request: objeto que armazena informações sobre amensagem pendente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 25 / 40

Programando com MPI

Envio/Recebimento Básico - Não-BloqueanteMPI_Isend(&buf, count, datatype, dest, tag, comm, &request)MPI_Irecv(&buf, count, datatype, source, tag, comm, &request)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Request *request: objeto que armazena informações sobre amensagem pendente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 25 / 40

Programando com MPI

Envio/Recebimento Básico - Não-BloqueanteMPI_Isend(&buf, count, datatype, dest, tag, comm, &request)MPI_Irecv(&buf, count, datatype, source, tag, comm, &request)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Request *request: objeto que armazena informações sobre amensagem pendente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 25 / 40

Programando com MPI

Envio/Recebimento Básico - Não-BloqueanteMPI_Isend(&buf, count, datatype, dest, tag, comm, &request)MPI_Irecv(&buf, count, datatype, source, tag, comm, &request)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Request *request: objeto que armazena informações sobre amensagem pendente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 25 / 40

Programando com MPI

Envio/Recebimento Básico - Não-BloqueanteMPI_Isend(&buf, count, datatype, dest, tag, comm, &request)MPI_Irecv(&buf, count, datatype, source, tag, comm, &request)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Request *request: objeto que armazena informações sobre amensagem pendente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 25 / 40

Programando com MPI

Envio/Recebimento Básico - Não-BloqueanteMPI_Isend(&buf, count, datatype, dest, tag, comm, &request)MPI_Irecv(&buf, count, datatype, source, tag, comm, &request)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Request *request: objeto que armazena informações sobre amensagem pendente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 25 / 40

Programando com MPI

Envio/Recebimento Básico - Não-BloqueanteMPI_Isend(&buf, count, datatype, dest, tag, comm, &request)MPI_Irecv(&buf, count, datatype, source, tag, comm, &request)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Request *request: objeto que armazena informações sobre amensagem pendente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 25 / 40

Programando com MPI

Envio/Recebimento Básico - Não-BloqueanteMPI_Isend(&buf, count, datatype, dest, tag, comm, &request)MPI_Irecv(&buf, count, datatype, source, tag, comm, &request)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Request *request: objeto que armazena informações sobre amensagem pendente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 25 / 40

Programando com MPI

Envio/Recebimento Básico - Não-BloqueanteMPI_Isend(&buf, count, datatype, dest, tag, comm, &request)MPI_Irecv(&buf, count, datatype, source, tag, comm, &request)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Request *request: objeto que armazena informações sobre amensagem pendente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 25 / 40

Programando com MPI

Envio/Recebimento Básico - Não-BloqueanteMPI_Isend(&buf, count, datatype, dest, tag, comm, &request)MPI_Irecv(&buf, count, datatype, source, tag, comm, &request)Parâmetros:

int *buf: ponteiro para início do bufferint count: número de elementosMPI_Datatype datatype: tipo de dado dos elementosint dest/source: rank do processo destino/fonteint tag: etiqueta (id) da mensagemMPI_Comm comm: communicatorMPI_Request *request: objeto que armazena informações sobre amensagem pendente

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 25 / 40

Programando com MPI

Exemplo Envio/Recebimento - Não-Bloqueante

#include <mpi.h>#include <stdio.h>

#define ROOT 0

int main(int argc , char **argv){

int rank , size , next , prev , buf[2], tag1 =999, tag2 =777;MPI_Request reqs [4];MPI_Status stats [4];

MPI_Init (&argc , &argv);MPI_Comm_rank(MPI_COMM_WORLD , &rank);MPI_Comm_size(MPI_COMM_WORLD , &size);

prev = rank -1;next = rank +1;if (rank == ROOT) prev = size - 1;if (rank == (size - 1)) next = ROOT;

MPI_Irecv (&buf[0], 1, MPI_INT , prev , tag1 , MPI_COMM_WORLD , &reqs [0]);MPI_Irecv (&buf[1], 1, MPI_INT , next , tag2 , MPI_COMM_WORLD , &reqs [1]);

MPI_Isend (&rank , 1, MPI_INT , prev , tag2 , MPI_COMM_WORLD , &reqs [2]);MPI_Isend (&rank , 1, MPI_INT , next , tag1 , MPI_COMM_WORLD , &reqs [3]);

/* do some work */

MPI_Waitall (4, reqs , stats);

MPI_Finalize ();return 0;

}

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 26 / 40

Programando com MPI

Envio/Recebimento - Não-BloqueanteHomework: estudar o programa n-bodya

afonte:www.mcs.anl.gov/research/projects/mpi/usingmpi/examples/advmsg/nbodypipe_c.htm

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 27 / 40

Programando com MPI

Comunicação ColetivaSincronização: MPI_BarrierUm para Vários: MPI_Bcast, MPI_ScatterVários para Um: MPI_Reduce, MPI_GatherVários para Vários: MPI_Allreduce, MPI_AllgatherOutras rotinas: MPI_Reduce_scatter, MPI_Alltoall, MPI_Scan

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 28 / 40

Programando com MPI

Comunicação ColetivaSincronização: MPI_BarrierUm para Vários: MPI_Bcast, MPI_ScatterVários para Um: MPI_Reduce, MPI_GatherVários para Vários: MPI_Allreduce, MPI_AllgatherOutras rotinas: MPI_Reduce_scatter, MPI_Alltoall, MPI_Scan

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 28 / 40

Programando com MPI

Comunicação ColetivaSincronização: MPI_BarrierUm para Vários: MPI_Bcast, MPI_ScatterVários para Um: MPI_Reduce, MPI_GatherVários para Vários: MPI_Allreduce, MPI_AllgatherOutras rotinas: MPI_Reduce_scatter, MPI_Alltoall, MPI_Scan

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 28 / 40

Programando com MPI

Comunicação ColetivaSincronização: MPI_BarrierUm para Vários: MPI_Bcast, MPI_ScatterVários para Um: MPI_Reduce, MPI_GatherVários para Vários: MPI_Allreduce, MPI_AllgatherOutras rotinas: MPI_Reduce_scatter, MPI_Alltoall, MPI_Scan

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 28 / 40

Programando com MPI

Comunicação ColetivaSincronização: MPI_BarrierUm para Vários: MPI_Bcast, MPI_ScatterVários para Um: MPI_Reduce, MPI_GatherVários para Vários: MPI_Allreduce, MPI_AllgatherOutras rotinas: MPI_Reduce_scatter, MPI_Alltoall, MPI_Scan

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 28 / 40

Programando com MPI

Comunicação ColetivaBarrier: cria uma barreira de sincronização entre processos de um mesmocommunicatorMPI_Barrier(comm)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 29 / 40

Programando com MPI

Comunicação ColetivaBroadcast: distribui dado de um processo para os outros de um mesmocommunicatorMPI_Bcast(&buffer, count, datatype, root, comm)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 30 / 40

Programando com MPI

Comunicação ColetivaScatter: distribui os dados de um processo para os outros participantesMPI_Scatter(&sendbuf, sendcnt, sendtype, &recvbuf, recvcnt, recvtype,root, comm)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 31 / 40

Programando com MPI

Comunicação ColetivaGather: Coleta dados de todos os processos participantesMPI_Gather(&sendbuf, sendcnt, sendtype, &recvbuf, recvcount,recvtype, root, comm)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 32 / 40

Programando com MPI

Comunicação ColetivaAllGather: Gather com todos os processos participandoMPI_Allgather(&sendbuf, sendcount, sendtype, &recvbuf, recvcount,recvtype, comm)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 33 / 40

Programando com MPI

Comunicação ColetivaAll to All: Distribui os dados de todos os processos para todos os outrosMPI_Alltoall(&sendbuf, sendcount, sendtype, &recvbuf, recvcnt,recvtype, comm)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 34 / 40

Programando com MPI

Comunicação ColetivaReduce: Condensa resultado de todos os processos em um processoMPI_Reduce(&sendbuf, &recvbuf, count, datatype, op, root, comm)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 35 / 40

Programando com MPI

Comunicação ColetivaAllReduce: Reduce onde resultado condensado vai para todos os processosMPI_Allreduce(&sendbuf, &recvbuf, count, datatype, op, comm)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 36 / 40

Programando com MPI

Operações de ReduçãoMPI name FunctionMPI_MAX maximumMPI_MIN minimumMPI_SUM sumMPI_PROD productMPI_LAND logical ANDMPI_BAND bit-wise ANDMPI_LOR logical ORMPI_BOR bit-wise ORMPI_LXOR logical XORMPI_BXOR bit-wise XORMPI_MAXLOC max value and locationMPI_MINLOC min value and location

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 37 / 40

Programando com MPI

Exemplo com Python - Cálculo de Pi (Monte Carlo Method)

# Calculating PI using random numbers (Monte Carlo Method)import mathimport randomfrom mpi4py import MPI

rank = MPI.COMM_WORLD.Get_rank ()size = MPI.COMM_WORLD.Get_size ()

count = 0NMAX = 10000000 # number of iterations (greater the better)n = NMAX / sizetic = MPI.Wtime()for i in xrange(n):

x1 = random.random ()x2 = random.random ()if (x1 * x1 + x2 * x2) <= 1.0: count += 1

mypi = MPI.COMM_WORLD.gather ((4.0 * count / NMAX), root =0) # seria mais simples usar um Reduceif rank == 0: pi = sum(mypi) # mas pode ser feito assim tambem ...

toc = MPI.Wtime(); wct = MPI.COMM_WORLD.gather(toc -tic , root =0)if rank == 0:

for task , time in enumerate(wct):print(’wall clock time: {0:e} seconds (task {1:d})’.format(time , task))

def mean(seq): return sum(seq)/len(seq)print(’all tasks , mean: {0:e} seconds ’.format(mean(wct)))print(’all tasks , min: {0:e} seconds ’.format(min(wct)))print(’all tasks , max: {0:e} seconds ’.format(max(wct)))print(’all tasks , sum: {0:e} seconds ’.format(sum(wct)))print "pi is approximately {0:.16f}, Error is {1:.16f}".format(pi , abs(pi - math.pi))

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 38 / 40

Sumário

1 IntroduçãoAntes, Durante e Depois da Paralelização...Modelos/Arquiteturas de Programação ParalelaParalelismo Implícito vs ExplícitoModelos de ComunicaçãoO que é MPI?Razões para usar MPI

2 Programando com MPIEstrutura de um Programa MPICompilando e Executando Programa MPIComunicadoresFunções Básicas de Inicialização e FinalizaçãoRotinas Básicas de Comunicação

3 Links Úteis

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 39 / 40

Links Úteis

http://www.mcs.anl.gov/research/projects/mpich2/http://www.lam-mpi.org/http://www.open-mpi.org/https://computing.llnl.gov/tutorials/mpi/http://www.mcs.anl.gov/research/projects/mpi/http://condor.cc.ku.edu/∼grobe/docs/intro-MPI-C.shtml (C)http://condor.cc.ku.edu/∼grobe/docs/intro-MPI.shtml (Fortran)http://www.mpi-forum.org/docs/docs.htmlhttp://www.google.com.br/ :-)

Guilherme Ferrari (IF - UFRGS) Introdução ao MPI Junho de 2010 40 / 40