1 / 68

Computação por Passagem de Mensagens

Computação por Passagem de Mensagens. P. P. M. M. Computadores. C. C. Rede com ligações diretas entre computadores. C. P. M. Multiprocessadores conectados por rede. Processadores conectados por uma rede estática com passagem de mensagens. Multiprocessadores conectados por rede.

Download Presentation

Computação por Passagem de Mensagens

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Computação por Passagem de Mensagens

  2. P P M M Computadores C C Rede com ligações diretas entre computadores C P M Multiprocessadores conectados por rede • Processadores conectados por uma rede estática com passagem de mensagens

  3. Multiprocessadores conectados por rede • Espaço de endereçamento compartilhado com acesso não uniforme • Ex: Cray Research T3E (2048), Sequent NUMA_Q (32 Pentium Pro), SGI Origin 2000 (128 MIPS) • Espaço de endereçamento compartilhado e uniforme • Ex: Sun Enterprise 10000 (64 Ultra Sparc 1)

  4. Clusters • Nós de multiprocessadores similares a computadores desktop • Aumento da velocidade das redes locais • Aparecimento de clusters de computadores de prateleira interligados por redes de alta velocidade • Exemplos: • Sandia Cplant (592 Compaq XP100 workstations interconectadas pela Myrinet) • IBM RS/6000 SP2 (512 nós, switch própria)

  5. Topologia das redes • Topologias entre total conexão e barramento único • Custo: • número de switches • número de ligações de um switch para conectar na rede • número de bits por switch • Desempenho: • latência para receber e enviar mensagem entre nós • número de mensagens por período de tempo • retardos por contenção no switch

  6. Anel Árvore n-cubo de 8 nós Grade bidimensional ou malha de 16 nós Topologia de redes

  7. Topologia de redes - Crossbar Switch Memórias • Rede não bloqueante 000 001 010 011 100 101 110 111 cruzamento aberto 000 001 010 CPUs 011 cruzamento fechado 100 101 110 111

  8. P 0 P 1 P 2 P 3 P 4 P 5 P 6 P 7 A C B D Caixa comutadora da rede Ômega Topologia de redes - rede Ômega

  9. Programação por passagem de mensagens • Programação de multiprocessadores conectados por rede pode ser realizada: • criando-se uma linguagem de programação paralela especial • estendendo-se as palavras reservadas de uma linguagem seqüencial existente de alto nível para manipulação de passagem de mensagens • utilizando-se uma linguagem seqüencial existente, provendo uma biblioteca de procedimentos externos para passagem de mensagens

  10. Biblioteca de rotinas para troca de mensagens • Necessita-se explicitamente definir: • quais processos serão executados • quando passar mensagens entre processos concorrentes • o que passar nas mensagens • Dois métodos primários: • um para criação de processos separados para execução em diferentes processadores • um para enviar e receber mensagens

  11. Código fonte Compila para gerar executável para cada processador Executáveis Processador 0 Processador n-1 Modelo Single Program Multiple Data (SPMD) • Diferentes processos são unidos em um único programa e dentro deste programa existem instruções que customizam o código, selecionando diferentes partes para cada processo por exemplo

  12. Modelo Multiple Program, Multiple Data (MPMD) • Programas separados escritos para cada processador, geralmente se utiliza o método mestre-escravo onde um processador executa o processo mestre e os outros processos escravos são inicializados por ele. Processo 1 spawn(); Inicia execução do processo 2 Processo 2 tempo

  13. Processo 1 x send(&x, 2); Rotinas básicas de envio e recebimento Processo 2 y recv(&y, 1);

  14. Rotinas síncronas • Rotinas que somente retornam quando a transferência da mensagem foi completada • Não necessita de buffer para armazenar a mensagem • uma rotina síncrona de envio pode esperar até que a mensagem completa possa ser aceita pelo processo receptor antes de enviar a mensagem • Uma rotina síncrona de recebimento espera até que a mensagem que ela está esperando chegue • Rotinas síncronas intrinsicamente realizam duas ações: transferem dados e sincronizam processos • Sugere a existência de alguma forma de protocolo de sinalização

  15. Processo 1 Processo 2 send(); recv(); tempo Pede para enviar Confirmação Processo suspenso Ambos continuam Mensagem Processo 1 Processo 2 send(); recv(); tempo Pede para enviar Processo suspenso Ambos continuam Mensagem Confirmação Rotinas síncronas para recebimento e envio de mensagens usando protocolo de sinalização

  16. Rotinas com bloqueio e sem bloqueio • Com bloqueio: utilizadas para descrever rotinas que não retornam enquanto a transferência da mensagem não se completou • os termos com bloqueio e síncrona são sinônimos • Sem bloqueio: utilizadas para descrever rotinas que retornam tendo sido ou não recebida a mensagem • Definições utilizadas pelo MPI: • com bloqueio: retornaapós ações locais terem sido executadas, mesmo que a transferência da mensagem não esteja completa • sem bloqueio: retorna imediatamente; assume que área onde está a mensagem não será modificada por instruções até que ocorra a transferência e deixa essa responsabilidade para o programador

  17. tempo Retorno das rotinas antes que transferência tenha sido efetuada • Necessita de um buffer para guardar a mensagem Processo 1 Processo 2 send(); recv(); Buffer de mensagens Continua o processo Lê buffer de mensagen

  18. Índice da mensagem • Utilizado para diferenciar os diversos tipos de mensagem que podem ser enviadas • Exemplo: • Para enviar uma mensagem com dado x e índice 5 de um processo fonte 1 para um processo destino 2, poderíamos ter send(&x, 2, 5); no processo fonte e recv(&y, 1, 5); no processo destino • Utiliza-se um índiceespecial (wild card) quando não se requer casamento de índices das mensagens de modo que a rotina recv() aceitará mensagem enviada por qualquer rotina send()

  19. Processo n-1 Processo 0 Processo 1 dado dado dado bcast(); bcast(); bcast(); buf Broadcast • Envio da mesma mensagem para todos os processos • Multicast: envio da mesma mensagem para um grupo de processos Ação Código

  20. Scatter • Envio de cada elemento de uma matriz de dados do processo raíz para um processo separado; o conteúdo da i-ésima localização damatriz é enviado para o i-ésimo processo Processo n-1 Processo 0 Processo 1 dado dado dado scatter(); scatter(); scatter(); Ação buf Código

  21. Gather • Um processo coleta dados de um conjunto de processos Processo n-1 Processo 0 Processo 1 dado dado dado gather(); gather(); gather(); Ação buf Código

  22. Reduce • Operação de gather combinada com uma operação lógica ou aritmética específica. Ex: valores coletados e somados pelo processo raíz Processo n-1 Processo 0 Processo 1 dado dado dado reduce(); reduce(); reduce(); Ação buf + Código

  23. Ferramentas de software que utilizam biblioteca de troca de mensagens • PVM (Parallel Virtual Machine) • desenvolvida pelo Oak Ridge National Laboratories para utilizar um cluster de estações de trabalho como uma plataforma multiprocessada • provê rotinas para passagem de mensagens entre máquinas homogêneas e heterogêneas que podem ser utilizadas com programas escritos em C ou Fortran • MPI (Message Passing Interface) • padrão desenvolvido por um grupo de parceiros acadêmicos e da indústria para prover um maior uso e portabilidade das rotinas de passagem de mensagens

  24. PVM • O programador decompõe o programa em programas separados e cada um deles será escrito em C ou Fortran e compilado para ser executado nas diferentes máquinas da rede • O conjunto de máquinas que será utilizado para processamento deve ser definido antes do início da execução dos programas • Cria-se um arquivo (hostfile) com o nome de todas as máquinas disponíveis que será lido pelo PVM • O roteamento de mensagens é feito pelos processos daemon do PVM

  25. Passagem de mensagens utilizando o PVM Estação de trabalho Daemon PVM Mensagens enviadas através da rede Estação de trabalho Estação de trabalho Daemon PVM Daemon PVM

  26. Passagem de mensagens utilizando o PVM Estação de trabalho Daemon PVM Programa da aplicação (executável) Mensagens enviadas através da rede Estação de trabalho Estação de trabalho Daemon PVM Daemon PVM Programa da aplicação (executável) Programa da aplicação (executável)

  27. Rotinas básicas do PVM • Todas as rotinas são sem bloqueio (ou assíncronas na terminologia PVM) enquanto que rotinas de recebimento podem ser com bloqueio (síncronas) ou sem bloqueio • Utiliza um índice para mensagem (message tag) e tem índice wild card • pvm_psend() e pvm_precv() • rotinas utilizadas quando dados sendo transmitidos são todos do mesmo tipo

  28. pvm_precv() e pvm_psend() Processo 2 Processo 1 Array com dados Array para receber dados Buffer de envio pvm_psend(); pvm_precv(); Pack Espera por mensagem Continua o processo

  29. Envio de mensagem com dados de vários tipos • Os dados são empacotados em um buffer antes de enviá-los • O receptor tem que desempacotá-los e acordo com o formato em que foram empacotados • Rotinas específicas para empacotamento e desempacotamento para cada tipo de dados

  30. processo_1 pvm_initsend(); pvm_pkint(.. &x ..); pvm_pkstr( …&s …); pvm_pkfloat( … &y …); pvm_send(processo_2 ...); Buffer de envio Envio de mensagem com dados de vários tipos processo_2 pvm_recv(processo_1 …); pvm_pkint(.. &x ..); pvm_pkstr( …&s …); pvm_pkfloat( … &y …); x s y Buffer de recepção

  31. Broadcast, multicast, scatter, gather e reduce • Operações utilizadas com grupo de processos (pvm_bcast(), pvm_scatter(),pvm_gather() e pvm_reduce()) com exceção de multicast (pvm_mcast) • Um processo se junta a um grupo através da rotinapvm_joingroup() • pvm_bcast envia mensagem para cada membro do grupo • pvm_gather() coleta valores de cada membro do grupo

  32. Mestre #include <stdio.h> #include <stlib.h> #include <pvm3.h> #define SLAVE ``spsum´´ #define PROC 10 #define NELEM 1000 main() { int mytid, tids[PROC] int n=NELEM, nproc =PROC; int no, i, who, msgtype; int data[NELEM],result[PROC],tot=0; char fn[255]; FILE *fp; mytid=pvm_mytid(); no=pvm_spawn(SLAVE,(char **)0,0,`` ``,nproc,tids); if (no < nproc) { printf(``Erro em disparar escravo\n``); for (i=0; i<no; i++) pvm_kill(tids[i]); pvm_exit(); exit(1); } strcpy(fn,getenv(``HOME´´)); strcat(fn,´´/pvm3/src/rand_data.txt´´); if ((fp=fopen(fn,``r´´))==NULL) { printf(``Nao posso abrir arquivo %s \n´´,fn); exit (1); } for (i=0; i<n; i++) fscanf(fp,”%d”,&data[i]); Escravo #include <stdio.h> #include <pvm3.h> #define PROC 10 #define NELEM 1000 main() { int mytid, tids[PROC] int n,me, i,msgtype; int x, nproc,master; int data[NELEM],sum; int x, low, high; mytid=pvm_mytid();

  33. Escravo msgtype=0; pvm_recv(-1,msgtype); pvm_upkint(&nproc,1,1); pvm_upkint(tids, nproc, 1); pvm_upkint(&n, 1,1 ); pvm_upkint(data, ,n,1); for (i=0;i<nproc;i++) if (mytid ==tids[i]) {me=i;break;} x=n/proc; low=me*x; high=low+x; for (i=low;i<high;i++) sum+=data[i]; pvm_initsend(PvmDataDefault); pvm_pkint(&me, 1, 1); pvm_pkint(&sum,1,1); msgtype=5; master=pvm_parent; pvm_send(master,msgtype); pvm_exit(); return(0); } Mestre pvm_initsend(PvmDataDefault); msgtype=0; pvm_pkint(&nproc,1 ,1); pvm_pkint(tids, nproc, 1); pvm_pkint(&n,1,1); pvm_pkint(data, n, 1); pvm_mcast(tids, nproc, type); msgtype = 5; for (i=0; i<nproc; i++) { pvm_recv(-1, msgtype); pvm_upkint(&who, 1, 1); pvm_upkint(&result[who], 1, 1); printf(“%d de %d \n”,result[who],who); } for (i=0;i<nproc;i++) tot +=result[i]; printf (“O total e %d. \n \n”,tot); pvm_exit(); return(0); } Broadcast Recebe resultados

  34. MPI • Criação e execução de processos • Propositalmente não são definidos e dependem da implementação • MPI versão 1 • Criação estática de processos: processos devem ser definidos antes da execução e inicializados juntos • Utiliza o modelo de programação SPMD • Communicators • Define o escopo das operações de comunicação • Processos têm posições definidas associadas ao communicator • Inicialmente todos os processos participam de um communicator universal chamado MPI_COMM_WORLD e cada processo possui uma única posição (0 a n-1) , onde n é o número total de processos • Outros communicators podem ser estabelecidos para grupo de processos

  35. Utilizando o modelo SPMD main (int argc, char *argv[]) { MPI_Init(&argc, &argv); . . MPI_Comm_Rank(MPI_COMM_WORLD, &myrank); if (myrank ==0) master(); else slave(); . . MPI_Finalize(); }

  36. Variáveis locais e globais • Qualquer declaração global será duplicada em cada processo • Para não haver duplicação de variável, deve-se declará-la dentro do código executado somente pelo processo • Exemplo: MPI_Comm_rank(MPI_COMMWORLD, &myrank); if (myrank==0) { int x, y; . . else if (myrank==1) { int x, y; . . }

  37. Processo 1 Processo 0 Destino send(…,1,…); Fonte send(…,1,…); lib() recv(…,0,…); recv(…,0,…); lib() lib() recv(…,0,…); recv(…,0,…); Modo não seguro de envio de mensagens Processo 1 Processo 0 Destino send(…,1,…); Fonte send(…,1,…); lib()

  38. Solução MPI • Communicators • utilizados em todas comunicações ponto-a-ponto e coletivas • domínio de comunicação que define um grupo de processos que podem se comunicar entre si • o domínio de comunicação da biblioteca pode ficar separado do domínio do programa do usuário • cada processo tem uma posição definida (rank) dentro de um communicator, um inteiro que varia de 0 a n-1, onde n é o número de processos

  39. Tipos de communicator • Intracommunicator • comunicação dentro de um grupo • Intercommunicator • comunicação entre grupos • Um processo tem um único rank em um grupo, que varia de 0 a m-1, onde m é o número de processos pertencentes a um grupo • Um processo pode ser membro de mais de um grupo • Intracommunicator default: MPI_COMM_WORLD • é o primeiro communicator de todos os processos da aplicação • conjunto de rotinas MPI para formar novos communicators

  40. Comunicação ponto-a-ponto • Índices para as mensagens • MPI_ANY_TAG: para não especificar índice • Para receber de qualquer fonte:MPI_ANY_SOURCE • Tipo de dados é enviado como parâmetro na mensagem • Rotinas com bloqueio • retornam quando estão completas localmente (local utilizado para guardar a mensagem pode ser utilizado novamente sem afetar envio da mensagem • Rotinas com bloqueio • retornam imediatamente mesmo que o local utilizado para guardar a mensagem não possa ser utilizado novamente sem afetar seu envio

  41. MPI_Send (buf, count, datatype, dest, tag, comm) Índice da mensagem Tipo de dados de cada item Endereço do buffer de envio Communicator Número de ítens a enviar Rank do processo destino Rotinas com bloqueio MPI_Recv (buf, count, datatype, src, tag, comm,status) Status após operação Tipo de dados de cada item Índice da mensagem Endereço do buffer de recepção Communicator Número máximo de ítens a receber Rank do processo fonte

  42. Exemplo de rotina com bloqueio Envio de um inteiro x do processo 0 para o processo 1 MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank ==0) { int x; MPI_Send(&x, 1, MPI_INT, 1, msgtag, MPI_COMM_WORLD); } else if (myrank ==1) { int x; MPI_Recv(&x, 1, MPI_INT, 0, msgtag, MPI_COMM_WORLD, status); }

  43. Rotinas sem bloqueio • MPI_Isend: retorna imediatamente antes do local da mensagem estar seguro • MPI_Irecv: retorna mesmo que não tenha mensagem a receber • Formatos: • MPI_Isend(buf, count, datatype, dest,tag, comm, request) • MPI_Irecv(buf, count, datatype, source, tag, comm, request) • MPI_Wait(): retorna somente após término da operação • MPI_Test(): retorna com um flag indicando se a operação já foi completada • Parâmetro request indica operação a ser verificada

  44. Exemplo de rotina sem bloqueio Envio de um inteiro x do processo 0 para o processo 1 MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank ==0) { int x; MPI_Isend(&x, 1, MPI_INT, 1, msgtag, MPI_COMM_WORLD,req1); processa(); MPI_Wait(req1, status); } else if (myrank ==1) { int x; MPI_Recv(&x, 0, MPI_INT, 1, msgtag, MPI_COMM_WORLD, status); }

  45. Modos de envio • Standard: • Não assume a existência de uma rotina correspondente de recebimento • Quantidade de memória para bufferização não definida • Se existe bufferização, envio pode ser completado antes de ocorrer a rotina de recebimento • Bufferizado • O envio pode ser inicializado e retornar antes de uma rotina correspondente de recebimento • A utilização do buffer deve ser especificada via as rotinas MPI_Buffer_attach() e MPI_Buffer_detach()

  46. Modos de envio • Síncrono: • As rotinas de envio e recebimento podem iniciar seus procedimentos uma antes da outra mas têm que finalizá-los juntas • Pronto (ready): • O envio da mensagem só pode ser iniciado se existe uma rotina de recebimento correspondente • Os quatro modos podem ser aplicados para rotinas de envio com e sem bloqueio • O modo standard é o único disponível para rotinas de recebimento com e sem bloqueio • Qualquer tipo de rotina de envio pode ser utilizada com qualquer tipo de rotina de recebimento

  47. Comunicação coletiva • Realizada em um conjunto de processadores definido por um intracommunicator • Não existem índices • MPI_Bcast(): envio do processo raíz para todos os outros • MPI_Gather(): coleta valores para um grupo de processos • MPI_Scatter(): espalha buffer de dados em partes para um grupo de processos • MPI_Alltoall():envia dados de todos os processos para todos os processos

  48. Comunicação coletiva • MPI_Reduce(): combina valores de todos os processos em um único valor • MPI_Reduce_scatter: combina valores e espalha resultado • MPI_Scan: calcula reduções de prefixo de dados dos processos

  49. Exemplo de rotina coletiva Coletar dados de um grupo de processos no processo 0 int data [10]; . MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank ==0) { MPI_Comm_size(MPI_COMM_WORLD,&grp_size); buf=(int *) malloc(grp_size*10*sizeof(int)); } MPI_Gather(data, 10, MPI_INT, buf, grp_size*10, MPI_INT,0,MPI_COMM_WORLD); }

  50. Barreira (barrier) • Em todos os sistemas de passagem de mensagens existe uma maneira de sincronizar os processos • MPI_Barrier(): • processos ficam bloqueados até todos os processos terem atingido essa instrução no programa

More Related