Algoritmos Propriedades Desejveis 1 Graus de simetria simetria

  • Slides: 20
Download presentation
Algoritmos - Propriedades Desejáveis (1) • Graus de simetria: – simetria total: todos os

Algoritmos - Propriedades Desejáveis (1) • Graus de simetria: – simetria total: todos os processos têm exatamente o mesmo comportamento. – Simetria textual: o código de todos os processos é igual. • forte: comportamento pode diferir apenas pelas diferentes mensagem recebidas • fraca: comportamento é determinado por informação global

Algoritmos - Propriedades Desejáveis (2) • Robustez a falhas de grau máximo de severidade.

Algoritmos - Propriedades Desejáveis (2) • Robustez a falhas de grau máximo de severidade. • Menor número de suposições sobre o ambiente (número total de processos, topologia). • Menor número de mensagens usadas. • Decisões de processos baseadas apenas em informações locais. • Fairness; ausência de deadlocks; ausência de starvation.

Ambientes e Linguagens • Ambientes (CORBA, Java) • Bibliotecas para linguagens (PVM, MPI, Linda).

Ambientes e Linguagens • Ambientes (CORBA, Java) • Bibliotecas para linguagens (PVM, MPI, Linda).

MPI • Message Passing Interface • É um sistema de troca de mensagens padronizado

MPI • Message Passing Interface • É um sistema de troca de mensagens padronizado e portável. • Baseado em uma biblioteca de funções que podem ser chamadas por programas C ou Fortran. • Responsável pela comunicação e sincronização de processos

MPI (2) • Pode ser usado em diversos tipos de máquinas de memória distribuída.

MPI (2) • Pode ser usado em diversos tipos de máquinas de memória distribuída. • Pode ser usado em redes locais heterogêneas.

MPI - Funcionamento • São iniciados daemons em máquinas que farão parte da "máquina

MPI - Funcionamento • São iniciados daemons em máquinas que farão parte da "máquina paralela". • Esses daemons permanecem "adormecidos" nas máquinas remotas até que recebam um sinal para carregar um arquivo executável MPI para executar.

MPI - Preparação (1) • No home do usuário, em cada computador remoto, deve

MPI - Preparação (1) • No home do usuário, em cada computador remoto, deve haver um arquivo chamado. rhosts. • Esse arquivo informa as máquinas que terão acesso à essa via rsh (remote shell). • Exemplo: work 120. dct. ufms. br mongelli 200. 129. 197. 121 mongelli work 122. dct. ufms. br mongelli work 123. dct. ufms. br mongelli

MPI - Preparação (2) • Em cada computador, é necessário criar um diretório no

MPI - Preparação (2) • Em cada computador, é necessário criar um diretório no home do usuário, onde será colocado pelo menos o programa executável. • Exemplo: mkdir mpi

MPI - Preparação (3) • Na máquina que vai iniciar o MPI, criar um

MPI - Preparação (3) • Na máquina que vai iniciar o MPI, criar um arquivo chamado lamhosts no diretório mpi. • Esse arquivo informa quais computadores da rede local farão parte da "máquina paralela". • Exemplo: work 120. dct. ufms. br work 121. dct. ufms. br work 122. dct. ufms. br work 123. dct. ufms. br

Hello World #include <stdio. h> #include <string. h> #include "mpi. h" int main(int argc,

Hello World #include <stdio. h> #include <string. h> #include "mpi. h" int main(int argc, char* argv[]){ int my_rank; int p; int source; int dest; char message[100]; MPI_Status status;

MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &p); if(my_rank != 0){ sprintf(message, "Greetings from process %d",

MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &p); if(my_rank != 0){ sprintf(message, "Greetings from process %d", my_rank); dest = 0; MPI_Send(message, strlen(message)+1, MPI_CHAR, dest, 0, MPI_COMM_WORLD); }

else{ for(source=1; source<p; source++){ MPI_Recv(message, 100, MPI_CHAR, source, 0, MPI_COMM_WORLD, &status); printf("%sn", message); }

else{ for(source=1; source<p; source++){ MPI_Recv(message, 100, MPI_CHAR, source, 0, MPI_COMM_WORLD, &status); printf("%sn", message); } } MPI_Finalize(); return 0; }

Envio de Mensagem • A função MPI_Send é usada para o envio de mensagens

Envio de Mensagem • A função MPI_Send é usada para o envio de mensagens individualmente entre processos. Sua sintaxe é: int MPI_Send( void* buffer /* in */, int count /* in */, MPI_Datatype datatype /* in */, int destination /* in */, int tag /* in */, MPI_Communicator /* in */)

Exemplo - Envio • A função MPI_Send é bloqueante. • MPI_Send(&x, 1, MPI_FLOAT, 1,

Exemplo - Envio • A função MPI_Send é bloqueante. • MPI_Send(&x, 1, MPI_FLOAT, 1, 0, MPI_COMM_WORLD); • O processo 0 envio um float para o processo 1.

Buffer de Envio • O buffer de envio de MPI_Send consiste de count sucessivas

Buffer de Envio • O buffer de envio de MPI_Send consiste de count sucessivas entradas do tipo indicado por datatype, começando pelo endereço buffer. • O comprimento da mensagem é especificado pelo número de entradas.

Recebimento de Mensagem • A função MPI_Recv é usada para o recebimento de mensagens

Recebimento de Mensagem • A função MPI_Recv é usada para o recebimento de mensagens individualmente entre processos. Sua sintaxe é: int MPI_Recv( void* buffer /* in */, int count /* in */, MPI_Datatype datatype /* in */, int source /* in */, int tag /* in */, MPI_Communicator /* in */, MPI_Status /* out */)

Buffer de Recebimento • O buffer de recebimento consiste de espaço suficiente para conter

Buffer de Recebimento • O buffer de recebimento consiste de espaço suficiente para conter count entradas consecutivas do tipo dado por datatype, iniciando-se no endereço buffer. • O tamanho da mensagem recebida deve ser menor ou igual ao buffer de recebimento.

Exemplo - Recebimento • A função MPI_Recv também é bloqueante. • MPI_Recv(&x, 1, MPI_FLOAT,

Exemplo - Recebimento • A função MPI_Recv também é bloqueante. • MPI_Recv(&x, 1, MPI_FLOAT, 0, 0, MPI_COMM_WORLD, &status); • O processador 1 recebe um float do processador 0, que é armazenado em x.

 • Para que o dado seja recebido é necessário que os argumentos em

• Para que o dado seja recebido é necessário que os argumentos em tag e communicator coincidam, e que exista memória suficiente para receber os dados.

Seleção de Mensagens • MPI_ANY_SOURCE • MPI_ANY_TAG

Seleção de Mensagens • MPI_ANY_SOURCE • MPI_ANY_TAG