Message Passing Interface - MPI. Jorge Barbosa

Documentos relacionados
Sistemas Distribuídos Message-Passing

Jorge Barbosa, FEUP-DEI 2008

Carla Osthoff LNCC/MCTI Exemplos:

Arquitecturas Paralelas I Computação Paralela em Larga Escala. Passagem de Mensagens

Parte da Tarefa. Parte da Tarefa. Parte da Tarefa SEND RECEIVE SEND RECEIVE

Programação Paralela com Troca de Mensagens. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Message Passing Interface - MPI

Computação por Passagem de Mensagens

Introdução a Computação Paralela: Rotinas MPI em Clusters Beowulf

Algoritmos Paralelos usando CGM/MPI. Edson Norberto Cáceres e Siang Wun Song DCT/UFMS e DCC/IME/USP Aula 05

CAP-387(2016) Tópicos Especiais em

Instruções para uso do MPI - Relatório Técnico -

Aula 5 Computação Distribuída de Alto Desempenho

MPI (Message Passing Interface)

Introdução. Programação Paralela. Motivação. Conhecimento do Hardware. Análise de Desempenho. Modelagem do Problema

Programação Paralela. Profa Mariana Kolberg e Prof. Luiz Gustavo Fernandes

Paralela e Distribuída. Memória Distribuída com o MPI

QUEBRA DE SENHAS MD5 UTILIZANDO MDCRACK E MPI

EXERCÍCIO 1 MUDANDO AS CORES

Computação por Passagem de Mensagens

Programação Paralela em Memória Compartilhada e Distribuída

Sistemas de Operação II. Ricardo Rocha

CAP-387(2016) Tópicos Especiais em

Por que dez milhões de cores?

Universidade de Coimbra - Faculdade de Ciências e Tecnologia Departamento de Matemática

Aula 3 Computação Distribuída de Alto Desempenho

TÍTULO: PROGRAMAÇÃO PARALELA - UMA INTRODUÇÃO AO PARALELISMO COM A OPENMPI

Fabrizio Borelli Gabriel Nobrega Henrique Dorotea Maitê Balhester

Comunicação orientada a mensagens

Laboratório de Programação Paralela. Introdução. Prof. Carlos Bazilio

Programação Paralela

MPI Linux. Alternativas Práticas

Comunicação Ponto a Ponto

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

CAP-387(2016) Tópicos Especiais em

Introdução à programação paralela em Fortran usando OpenMP e MPI

1 - CONCEITOS BÁSICOS

Comunicação Interprocessos

Programação Concorrente e Paralela

Introdução à Programação em C Input / Output

Programação Estruturada

A linguagem C (visão histórica)

Ponteiros e Tabelas. K&R: Capítulo 5

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

O Modelo Síncrono BSP para Computação Paralela

ANDRÉ LUIS GOBBI PRIMO

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Básico: estrutura de programa, sintaxe Interface com linha de comando

Introdução à Programação Aula 07. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Programação 5374 : Engenharia Informática 6638 : Tecnologias e Sistemas de Informação. Cap. 7 Arrays. Arrays

Curso de Informática DCC-IM / UFRJ. Gabriel P. Silva MPI

Programação em Paralelo OpenMP

Programação de Arquiteturas com Memória Distribuída Utilizando MPI

Introdução Arquiteturas Paralelas Programação Paralela Geração de Malhas Particionamento de Malhas (Grafos) Balanceamento de Carga

Message Passing Interface

apt-get install openssh-client (Debian) yum install openssh-clents (Fedora) slapt-get install openssh (Slackware)

Message Passing Interface

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Programação Estruturada

PROGRAMAÇÃO PARALELA USANDO MPI

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Introdução à Lógica de Programação

Linguagem C. Linguagem artificial e formal usada para comunicar instruções ao computador. Proposta por Dennis Ritchie entre 1969 e 1973.

ecos - Gestores de dispositivos

UNIVERSIDADE DA BEIRA INTERIOR

#include <stdio.h> void Swap (int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } main () {

Introdução à Programação em C (II)

Relatório do Trabalho de Conclusão de Curso Curso de Ciência da Computação

SSC300- Linguagens de Programação e Aplicações Profa Vânia de Oliveira Neves. ICMC/USP São Carlos

Paralela e Distribuída. com o MPI e o OpenMP

Programação. MEAer e LEE. Bertinho Andrade da Costa. Instituto Superior Técnico. Argumentos da linha de comando Funções recursivas

Introdução à Programação. Introdução a Linguagem C. Prof. José Honorato F. Nunes

Introdução à Programação em C

13 Operadores relacionais

Ambientes de troca de mensagens - MPI. Aleardo Manacero Jr.

Grades Computacionais: Conceitos Fundamentais e Casos Concretos

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

MPI - Continuação. Qual o output do programa: from mpi4py import MPI comm = MPI.COMM_WORLD nprocs = comm.get_size() rank = comm.

Carlos Eduardo Batista. Centro de Informática - UFPB

Linguagem C Introdução. Contexto Histórico Principais diferenças do Java Funções em C Compilar programas em C no Linux

Curso de Introdução à Liguagem de. Grupo PET-Tele. Universidade Federal Fluminense. July 16, 2012

Operações em Arquivos. MC102 Felipe Bergo

AVALIAÇÃO DA PLATAFORMA OPEN MPI PARA PARALELIZAÇÃO DO PROCESSO DE COMPILAÇÃO DE SOFTWARE

Linguagem C. André Tavares da Silva.

Arranjos. David Déharbe

1/24 FICHEIROS DE TEXTO

Controlo de Execução. K&R: Capitulo 3

ponteiros INF Programação I Prof. Roberto Azevedo

Linguagem de Programação. Thiago Leite Francisco Barretto

Programação Paralela Avançada. N. Maillard - M. Cera

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

Ponteiros & tabelas (cont.) K&R: Capítulo 5

Introdução à Programação

O que é um apontador em C (type pointer in C)?

Centro Nacional de Processamento de Alto Desempenho - SP TREINAMENTO: INTRODUÇÃO AO MPI CENAPAD-SP

Transcrição:

Message Passing Interface - MPI Jorge Barbosa

Introdução ao MPI Até ao fim dos anos 80, os fabricantes de computadores desenvolviam a sua própria biblioteca de funções para desenvolver programas paralelos. Resulta código não portável A falta de um standard dificulta o desenvolvimento das aplicações Em Abril de 92 começou o forum MPI: (www.mpi-forum.org) Participaram fabricantes de hardware e software, universidades e utilizadores finais. Ao fim de uma série de reuniões resultou a especificação standard do MPI O objectivo consistiu em incluir na especificação toda a funcionalidade que se julgava necessária para fazer do modelo passagem de mensagens um caso de sucesso. A versão final do standard MPI 1 foi terminada em Maio de 1994. A versão MPI 2 foi terminada em 1998. Apenas em 2003 foram distribuidas implementações segundo o standard MPI 2.

Introdução ao MPI Especificação de uma biblioteca standard: Define a sintaxe e semântica de um modelo para passagem de mensagens Não é uma linguagem nem um compilador Não é uma implementação específica Não especifica detalhes de implementação, apenas sugere soluções. As implementações realizadas podem fazer as mesmas coisas de forma muito diferente. Os fabricantes deverão desenvolver uma implementação do standard MPI que funcione, e optimize a execução dos programas, no seu sistema.

Introdução ao MPI Principais características do MPI para suportar paralelismo numa arquitectura de memória distribuída: Rotinas para troca de mensagens: Identifica processos emissor/receptor Comunicações ponto-a-ponto Comunicações colectivas Rotinas para sincronização Tipos de dados derivados para facilitar o envio na mesma mensagens de dados não contíguos na memória Facilidade de definir subconjuntos de processos Possibilidade de criar topologias de processos

Principais implementações MPICH Argonne National Lab www.mcs.anl.gov/mpi/mpich (MPI2 em Abril de 2003) LAM Ohio Supercomputer Center www.lam-mpi.org CHIMP Edinburgh Parallel Computing Centre www.epcc.ed.ac.uk/chimp WMPI Critical Software www.criticalsoftware.com/hpc/ Versão Windows do MPI2 lançada em Julho de 2003 Versão Linux do MPI2 lançada em Janeiro de 2004

Introdução ao MPI O MPI contém mais de 125 rotinas Uma grande parte dos programas pode ser escrita apenas com 6 rotinas Depois de iniciar, os processos são identificados pelo rank (de 0 a N-1) dentro do conjunto N de processos criados. Este valor pode ser utilizado para particularizar as acções que cada processo deve fazer. Principais instruções: MPI_INIT: Inicializa o MPI MPI_Finalize: Finaliza o MPI MPI_COMM_SIZE: número de processos criados MPI_COMM_RANK: qual o número de processo (0 a N-1) MPI_SEND: Envio de mensagem MPI_RECV: Recepção de mensagem

MPI_Init, MPI_Finalize int MPI_Init(int *argc, char ***argv) inicializa o ambiente de execução do MPI Deve ser a primeira instrução executada Só pode ser chamada uma vez int MPI_Finalize() Finaliza o ambiente de execução do MPI Os processos têm de invocar esta rotina antes de terminarem.

Estrutura básica de um programa #include mpi.h int main () { MPI_Init () processamento MPI_Finalize () } processamento adicional e local não pode invocar mais rotinas MPI.

Comunicação entre processos O MPI define grupos de processos comunicadores Os processos para comunicarem têm de pertencer a um comunicador (grupo). Por defeito existe o MPI_COMM_WORLD, que representa todos os processos. Dentro do comunicador, cada processo tem um número (rank). P2 P1 P3 Pn MPI_COMM_WORLD O utilizador pode definir vários comunicadores para agrupar os processos em grupos de trabalho. Utilização: Broadcast de uma mensagem para o grupo. Sincronização dos processos do grupo especifico.

Comunicação entre processos MPI_Comm_size(MPI_Comm comm, int *size) A função devolve em size o número de processos que pertencem ao comunicador (grupo) comm MPI_Comm_rank(MPI_Comm comm, int *rank) A função devolve em rank a posição do processo dentro do comunicador comm.

Comunicação entre processos int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ) Instrução para enviar um conjunto de dados referênciados por buf para o processo dest (rank) dentro do comunicador comm. Parâmetros de entrada: buf: initial address of send buffer (choice) count: number of elements in send buffer (nonnegative integer) datatype: datatype of each send buffer element (handle) dest: rank of destination (integer) tag: message tag (integer) comm: communicator (handle)

MPI_Datatype: Comunicação entre processos

Comunicação entre processos int MPI_Recv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status) Instrução para receber um conjunto de dados para buf enviados por source (rank) dentro do comunicador comm. Parâmetros de entrada: count: maximum number of elements in receive buffer (integer) datatype: datatype of each receive buffer element (handle) source: rank of source (integer) (Pode ser MPI_ANY_SOURCE) tag: message tag (integer) (Pode ser MPI_ANY_TAG) comm: communicator (handle) Parâmetros de saída: buf initial address of receive buffer (choice) status status object (Status) (Pode ser MPI_STATUS_IGNORE)

MPI_Status MPI Status The MPI_Status datatype is a structure. The three elements for use by programmers are: MPI_SOURCE Who sent the message MPI_TAG What tag the message was sent with MPI_ERROR Any error return

Erros que podem resultar da execução das instruções anteriores MPI_SUCCESS No error; MPI routine completed successfully. MPI_ERR_COMM Invalid communicator. A common error is to use a null communicator in a call (not even allowed in MPI_Comm_rank). MPI_ERR_TYPE Invalid datatype argument. May be an uncommitted MPI_Datatype (see MPI_Type_commit). MPI_ERR_COUNT Invalid count argument. Count arguments must be non-negative; a count of zero is often valid. MPI_ERR_TAG Invalid tag argument. Tags must be non-negative; tags in a receive (MPI_Recv, MPI_Irecv, MPI_Sendrecv, etc.) may also be MPI_ANY_TAG. The largest tag value is available through the the attribute MPI_TAG_UB. MPI_ERR_RANK Invalid source or destination rank. Ranks must be between zero and the size of the communicator minus one; ranks in a receive (MPI_Recv, MPI_Irecv, MPI_Sendrecv, etc.) may also be MPI_ANY_SOURCE.

Exemplo 1: Hello World Escrever um programa em que cada processo escreve Hello word from process i of n onde n corresponde ao total de processos. Assumir que todos os processos podem usar printf. #include <stdio.h> #include "mpi.h" int main( argc, argv ) int argc; char **argv; { int rank, size; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); printf( "Hello world from process %d of %d\n", rank, size ); MPI_Finalize(); return 0; } >mpicc -o helloworld helloworld.c >mpirun -np 4 helloworld

Exemplo 2: Comunicação em Anel Escrever um programa em que o processo 0 lê um valor do teclado e comunica-o ao processo seguinte, em anel. Ou seja, o processo i recebe o valor de i-1 e envia-o para o processo i+1 até atingir o último processo. #include <stdio.h> #include "mpi.h" int main( int argc,char **argv ) { int rank, value, size; MPI_Status status; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); do { if (rank == 0) { scanf( "%d", &value ); MPI_Send( &value, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD ); } else { MPI_Recv( &value, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, &status ); if (rank < size - 1) MPI_Send( &value, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD ); } printf( "Process %d got %d\n", rank, value ); } while (value >= 0); } MPI_Finalize( ); return 0;