Sistemas Distribuídos Message-Passing

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

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

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

Message Passing Interface - MPI. Jorge Barbosa

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

Por que dez milhões de cores?

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

Comunicação Coletiva

EXERCÍCIO 1 MUDANDO AS CORES

Computação por Passagem de Mensagens

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

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

Programação Paralela

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

Comunicação Interprocessos

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

Message Passing Interface

Computação por Passagem de Mensagens

Message Passing Interface

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

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

Message Passing Interface - MPI

QUEBRA DE SENHAS MD5 UTILIZANDO MDCRACK E MPI

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

Curso de Informática DCC-IM / UFRJ MPI. Um curso prático. Gabriel P. Silva

Jorge Barbosa, FEUP-DEI 2008

Comunicação orientada a mensagens

Carla Osthoff LNCC/MCTI Exemplos:

CAP-387(2016) Tópicos Especiais em

Comunicação Ponto a Ponto

MPI (Message Passing Interface)

Programação Paralela e Distribuída ERAD-SP de julho de 2010 Liria Matsumoto Sato

Fabrizio Borelli Gabriel Nobrega Henrique Dorotea Maitê Balhester

Sistemas de Operação II. Ricardo Rocha

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

1 - CONCEITOS BÁSICOS

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

CAP-387(2016) Tópicos Especiais em

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

Relatório Trabalho 1 Programação Paralela

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

2 Arquitetura Paralela

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

Comunicação orientada a mensagens

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

Clusters de Alto Desempenho e programação distribuída

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

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

MPI2.NET: Criação Dinâmica de Tarefas com Orientação a Objetos

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

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

Message-Passing Interface Avançado

PROGRAMAÇÃO PARALELA USANDO MPI

CAP-387(2016) Tópicos Especiais em

ANDRÉ LUIS GOBBI PRIMO

Artigo de Seminário Processamento Distribuído: Cliente/Servidor e Cluster Fabrizio Borelli 1, Gabriel Nóbrega 1, Henrique Dorotea 1, Maitê Balhester 1

Programação Concorrente e Paralela

ALGORÍTMOS PARALELOS (Aula 5)

Grades Computacionais: Conceitos Fundamentais e Casos Concretos

Exercício de MPI Relatório do Trabalho

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

UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO

LI KUAN CHING ANÁLISE E PREDIÇÃO DE DESEMPENHO DE PROGRAMAS PARALELOS EM REDES DE ESTAÇÕES DE TRABALHO. Escola Politécnica da USP

Comunicação orientada a mensagens

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

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

Hybrid MPI Uma Implementação MPI para Ambientes Distribuídos Híbridos

MPI Linux. Alternativas Práticas

Especificação e Verificação de Protocolos para Programas MPI

Tolerância a Falhas. especialmente em grades

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

Programação Estruturada

Programação de Alto Desempenho - 2. Prof: Carla Osthoff

COMPUTAÇÃO PARALELA. uma visão geral. Guilherme Galante. v.2.0

Uma Visão Geral dos Sistemas distribuídos de Cluster e Grid e suas Ferramentas para o processamento paralelo de dados

Um Visualizador de Carga de Rede para um Cluster que utiliza a biblioteca MPI

Carlos Eduardo Batista. Centro de Informática - UFPB

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

Paralelização de Algoritmos de CFD em Clusters Multi-Core MC7. Escola de Verão Arquiteturas Multi-Core

Programação Paralela. Introdução

Linguagem Chapel. Walter Perez Urcia. Universidade de São Paulo Instituto de Matemática e Estadística Departamento de Ciências da Computação

2 Pedro Otávio Teixeira Mello et al.

Programação Paralela. Simone de Lima Martins Agosto/2002

Biblioteca de Aplicação Genérica de Algoritmos Genéticos Paralelos Distribuídos

AULA 03: PROCESSAMENTO PARALELO: MULTIPROCESSADORES

Computação Aplicada:

INTRODUÇÃO À LINGUAGEM C. Prof. Msc. Luis Filipe Alves Pereira 2015

Exploração do paralelismo em arquiteturas multicore, multicomputadores e gpus

CAP-387(2016) Tópicos Especiais em

Técnicas de Processamento Paralelo na Geração do Fractal de Mandelbrot

AULA 06: PROGRAMAÇÃO EM MÁQUINAS PARALELAS

Aluno de Pós-Graduação em Engenharia de Software para Dispositivos Móveis pela UNINTER

Comunicaçãoentre processos: Mensagens

Universidade Federal do ABC. Dissertação de Mestrado. Aderbal de Morais Junior

TE091 Programação Orientada a Objetos Engenharia Elétrica

Aula 17: Ponteiros e Alocação Dinâmica em C

Transcrição:

0010010101011101010111100010111100010101010100100111001010001001010100101010100010010100101010110101010101 01100000011111101010010100010101010010010101101001000100101010111010101111000101111 101010101001001110010100010010101001010101000100101001010101101010101010110000001111110101001010001010101001001010110100100010010 Sistemas Distribuídos Message-Passing Interface Universidade Federal do ABC Turma: Ciência da Computação Prof. Dr. Francisco Isidro Massetto

Cluster Computing Cluster Aglomerado de máquinas (nós) Visão de único sistema (single( single-imageimage system) Implementação de Sistema Distribuído Utilização Necessidade de alto poder computacional Computação gráfica Análise de elementos finitos Sensoramento remoto Exploração sísmica

Cluster Computing Utilização Necessidade de tolerância a falhas Segurança de Dados Internet Disponibilidade Descentralização de atividades

Desafio Programar Aplicações que demandem alto poder de processamento Paralelização dos dados Distribuição Ausência de memória global compartilhada

Arquitetura

MPI Message-Passing Interface Interface que implementa primitivas de comunicação ponto-a-ponto e coletivas Responsável por todo o processo de estabelecer comunicação Abstrai aspectos de protocolos de transporte

MPI Introduzido pelo MPI Forum em maio de 1994 atualizado em junho de 1995. Incluiu a participação de vendedores de hardware, pesquisadores, acadêmicos, desenvolvedores de bibliotecas de software, e usuários "MPI: A Message-Passing Standard", University of Tennesee, Argonne National Laboratory.

Arquiteturas Distribuídas Memória A=5 Memória A=? Memória A=? P1 P2... Pn Cache Cache Cache A=5

Identificação de Processos Cada processo é identificado por um rank rank Todos os processos são disparados (através de execução remota) nas máquinas determinadas Uma máquina pode executar vários processos (não necessariamente um em cada máquina) N processos ranks de 0 a N-1N

Tipos de Primitivas Mais de 125 primitivas ao todo MPI_Init inicialização para o ambiente MPI MPI_Comm_size retorna o número de processadores MPI_Comm_rank retorna o "rank" rank" " (índice, identificador) do processador MPI_Send envia uma mensagem MPI_Recv recebe uma mensagem MPI_Finalize sai do ambiente MPI

MPI Tamanho da mensagem < Limite MPI_Send S R buffer interno do receptor MPI_Recv

MPI Tamanho da Mensagem > Limite MPI_Send espera espera MPI_Recv

Tipos Básicos de Dados MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED MPI e MPI_UNSIGNED_CHAR e MPI_UNSIGNED_SHORT e MPI_UNSIGNED e MPI_UNSIGNED_LONG

Principais Primitivas Iniciação e Finalização MPI Número de argumentos Argumentos (vetor) MPI_Init (int * MPI_Finalize (void( void) int *argc, char ***argv argv) Sem parâmetros Exemplo: void main(int argc;char *argv[]) { MPI_Init (&argc, &argv);... MPI_Finalize (); }

Principais Primitivas Número de Processos MPI Comunicador MPI MPI_Comm_size (MPI_Comm comm comm, int *size* size) Variável de retorno Exemplo: int ntasks; MPI_Comm_size (MPI_COMM_WORLD, &ntasks);

Principais Primitivas MPI Identificação do Processo Vigente Comunicador MPI MPI_Comm_rank (MPI_Comm comm comm, int *rank* rank) Variável de retorno Exemplo: int rank; MPI_Comm_rank (MPI_COMM_WORLD, &rank);

Principais Primitivas Envio de Mensagens MPI Endereço inicial dos dados que serão enviados Número de elementos a serem enviados Tipo do dado MPI_Send (void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm) Processo destino Rótulo da mensagem Comunicador MPI Exemplo: int vetor[10]={0,1,2,3,4,5,6,7,8,9}; MPI_Send (vetor, 10, MPI_INT, 1, 0, MPI_COMM_WORLD);

Principais Primitivas MPI Recebimento de Mensagens Endereço inicial da variável que receberá os dados Número de elementos a serem recebidos Tipo do dado MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_Status *status) Processo fonte esperado Rótulo esperado Comunicador MPI Exemplo: int vetor[10]; MPI_Status status; /* status.mpi_source e status.mpi_tag */ MPI_Recv (vetor, 10, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); Processo fonte e rótulo efetivos

Primitivas MPI Comunicação Coletiva Endereço inicial dos dados a serem enviados ou recebidos Número de elementos a serem enviados/recebidos Tipo do dado MPI_Bcast (void *buf, int count, MPI_Datatype dtype, int root, MPI_Comm comm) Processo único que envia dados (os demais apenas recebem tais dados) Comunicador MPI Exemplo: int vetor[50]; MPI_Bcast (vetor, 50, MPI_INT, 0, MPI_COMM_WORLD);

Primitivas MPI Comunicação Coletiva com Redução Endereço inicial dos dados que serão enviados por cada processo Endereço da variável que receberá os dados resultantes (processados) Número de elementos a serem enviados/recebidos Comunicador MPI void *sendbuf, void *recvbuf, int count, MPI_Datatype dtype,mpi_op op,int root,mpi_comm comm) MPI_Reduce (void Tipo do dado Operação de processamento feita nos dados enviados, gerando os dados resultantes recebidos por root Processo único que recebe os dados resultantes Exemplo: int total, parcial; MPI_Reduce (&parcial, &total, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

Primitivas MPI Endereço inicial dos dados que serão enviados para cada processo Número de elementos a serem enviados Tipo do dado MPI_Scatter(void *sendbuf,, int sendcount, MPI_Datatype sendtype, void *recvbuf,, int recvcount, MPI_Datatype recvtype,, int root, MPI_Comm comm) Tipo do dado Processo único que recebe os dados resultantes Comunicador MPI Número de elementos a serem recebidos Endereço inicial de recebimento para cada processo

Primitivas MPI Endereço inicial dos dados que serão enviados Número de elementos a serem enviados Endereço inicial de recebimento para o processo root Tipo do dado MPI_Gather(void *sendbuf,, int sendcount, MPI_Datatype sendtype, void *recvbuf,, int recvcount, MPI_Datatype recvtype,, int root, MPI_Comm comm) Tipo do dado Processo único que recebe os dados resultantes Comunicador MPI Número de elementos a serem recebidos

Operações de Redução MPI MPI_MAX (maximum) MPI_MIN (minimum) MPI_SUM (sum) MPI_PROD (product) MPI_LAND (logical and) MPI_LOR (logical or) MPI_LXOR (logical exclusive or) MPI_BAND (bitwise and) MPI_BOR (bitwise or) MPI_BXOR (bitwisebitwise exclusive or)

Exemplo de um programa MPI Os processos deverão determinar o maior elemento de um vetor Modelo mestre-escravo escravo Um processo distribui as tarefas (mestre) Os demais (escravos) executam e retornam o resultado ao mestre 2 Estratégias Comunicação ponto-a-ponto Comunicação coletiva

Rotina Principal #include "mpi.h" #include <stdio.h> int numprocs, rank; int mestre(); int escravo(); int main(int argc, char* argv[]) { MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if(rank==0) mestre(); else escravo(); MPI_Finalize(); }

Estratégia 1 Procedimento Mestre int mestre() { /* processo irá popular um conjunto de vetores de maneira aleatória e envia-los a seus escravos para processamento */ MPI_Status status; int i, j, maior_parcial, maior, vetor[100]; } for(i=1; i<numprocs numprocs; ; i++) { for(j=0; j<100; j++) vetor[j]=numero_aleatorio numero_aleatorio(); // função qualquer pré-definida MPI_Send(vetor, 100, MPI_INT, i, 1, MPI_COMM_WORLD); } maior=0; for(i=1; i<numprocs numprocs; ; i++) { MPI_Recv(&maior_parcial, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); if(maior<maior_parcial) maior=maior_parcial; } printf("maior entre %d elementos: %d\n", 100*(numProcs numprocs-1), maior);

Estratégia 1 Procedimento Escravo int escravo() { /* processo irá receber parcialmente um vetor e determinar seu máximo valor local */ MPI_Status status; int j, maior_parcial, vetor[100]; } MPI_Recv(vetor, 100, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); maior_parcial=0; for(j=0; j<100; j++) { if(maior_parcial<vetor[j]) maior_parcial=vetor[j]; } MPI_Send(&maior_parcial, 1, MPI_INT, 0,1,MPI_COMM_WORLD);

Estratégia 2 Procedimento Mestre int mestre() { MPI_Status status; int i, maior_parcial, maior, vetor[1000]; } for(i=0; i<1000; i++) vetor[i]=numero_aleatorio numero_aleatorio(); // função qualquer pré-definida /* envio o vetor como um todo */ MPI_Bcast(vetor, 1000, MPI_INT, 0, MPI_COMM_WORLD); maior_parcial=0; for(i=0; i<1000/numprocs numprocs; ; i++) { if(maior_parcial<vetor[i]) maior_parcial=vetor[i]; } MPI_Reduce(&maior_parcial, &maior, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD); ORLD); printf("maior entre 1000 elementos: %d\n", maior);

Estratégia 2 Procedimento Escravo int escravo() { MPI_Status status; int i, inicio, fim, maior_parcial, maior, vetor[1000]; // recebo todo o vetor e trato apenas a parte que sou responsável sável MPI_Bcast(vetor, 1000, MPI_INT, 0, MPI_COMM_WORLD); inicio=(1000/numprocs numprocs)* )*rank; fim=(1000/numprocs numprocs)*( )*(rank+1); } if(fim>1000) fim=1000; maior_parcial=0; for(i=inicio; i<fim; i++) { if(maior_parcial<vetor[i]) maior_parcial=vetor[i]; } MPI_Reduce(&maior_parcial, &maior, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);