MPI – Message Passing Interface by pharmphresh36

VIEWS: 175 PAGES: 10

									MPI – Message Passing Interface
              Básico


        Guilherme Galante
O Modelo Message-Passing
• O modelo "Massage-Passing" é um dos vários
  modelos computacionais para conceituação de
  operações de programa
• O modelo "Message-Passing" é definido como:
  – Conjunto de processos que possuem acesso à
    memória local
  – Comunicação dos processos baseados no envio e
    recebimento de mensagens
  – A transferência de dados entre processos requer
    operações de cooperação entre cada processo (sends
    e receives)
MPI – Message Passing Interface
•   Padrão
•   Diversas implementações: LAM, MPICH, MPI-F...
•   125 funções
•   C e Fortran

• Paralelismo Explícito
• Primitivas:
    – Gerência de processos
    – Comunicação ponto-a-ponto
    – Comunicação coletiva

• Todo paralelismo é explícito
 MPI – Message Passing Interface
• Compilação:
   mpicc –o <exec> <fonte.c>


• Execução:
   mpirun –np <num_proc> <exec> -nolocal -machinefile <nomearq>


Exemplo:
   mpirun –np 10 teste -nolocal -machinefile nodos
   – Irá executar o programa teste utilizando 10 processos (-np 10)
   – Não executará no front-end do cluster (-nolocal)
   – Utilizará as máquinas listadas no arquivo nodos (-machinefile nodos)
 MPI – Message Passing Interface
• Rotinas Básicas
   –   MPI_Init
   –   MPI_Comm_rank
   –   MPI_Comm size
   –   MPI_Send
   –   MPI_Recv
   –   MPI_Finalize
   –   MPI_Bcast


• Com estas 7 instruções básicas pode-se resolver uma
  grande quantidade de problemas
MPI: Exemplo I
Rotinas de Inicialização

#include “mpi.h”
#include <stdio.h>
int main( int argc, char * argv[ ] )
{
     int processId; /* rank dos processos */
     int noProcesses; /* Número de processos */
     int nameSize; /* Tamanho do nome */
     char computerName[MPI_MAX_PROCESSOR_NAME];

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &noProcesses);
    MPI_Comm_rank(MPI_COMM_WORLD, &processId);
    MPI_Get_processor_name(computerName, &nameSize);
    printf("Hello from process %d on %s\n", processId, computerName);
    MPI_Finalize( );
    return 0;
}
                                         if (myrank != 0)
MPI: Exemplo II                          {
                                                 sprintf(msg, "Hello world from process %d\n",
Sends e Receives
                                                 myrank);
                                                 dest = 0;
#include <stdio.h>
#include "mpi.h“                                 MPI_Send(msg, strlen(msg)+1, MPI_CHAR, dest, tag,
                                                 MPI_COMM_WORLD);
int main(int argc, char **argv)          }
{                                        else
     int myrank,src, dest, p, tag = 1;   {
    char msg[256];                               printf("Hello world from process %d\n", myrank);
    MPI_Status status;                           for (src = 1; src < p; src++)
                                                 {
    MPI_Init(&argc, &argv);                            MPI_Recv(msg, 256, MPI_CHAR, src, tag,
    MPI_Comm_rank(MPI_COMM_WORLD,                MPI_COMM_WORLD, &status);
    &myrank);                                            printf("%s", msg);
    MPI_Comm_size(MPI_COMM_WORLD,                }
    &p);                                     }
                                             MPI_Finalize();
                                             return 0;
                                         }
MPI: Exemplo III
Broadcast
#include <stdio.h>
#include <stdlib.h>                             MPI_Bcast(&message, 20, MPI_CHAR,
#include "mpi.h“                                0, MPI_COMM_WORLD);


int main(int argc, char **argv )                printf("process ID :: %d\t%s\n", rank,
{                                               message);
    char message[20];
    int rank;                                   MPI_Finalize();
    int size;
    MPI_Status status;                          return 0;
    MPI_Init(&argc, &argv);                 }
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    if(rank == 0)
    {
         strcpy(message, "Hello, world");
   }
Atividades
1. Execute os códigos mostrados nos exemplos
2. Implemente um programa que:
  –  cada nó escravo recebe do nó mestre (nó 0) um
    intervalo de valores (por exemplo: [1, 15])
  – calcula quantos números primos existe neste
    intervalo
  – Envia a resposta para o mestre
  – O mestre imprime a resposta na tela
                                   MPI Básico
int MPI_Init (int *argc, char *argv[ ])

int MPI_Comm_rank (MPI_Comm comm, int *rank)

int MPI_Comm_size (MPI_Comm comm, int *size)

int MPI_Send (void *sndbuf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm)

int MPI_Recv (void *recvbuf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm
    comm, MPI_Status status)

int MPI_Finalize (void)

int MPI_Bcast (void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm)

double MPI_Get_processor_name (char *procname, int *namelen)

								
To top