Olá Mundo com MIP em C
Atualizado em:
MPI é a sigla para Message Passing Interface, um padrão de comunicação de dados para computação paralela. Você pode programar e dividir o processamento em vários processadores para otmizar o desempenho. É utilizado em computação de alto desempenho em supercomputadores espalhados pelo mundo.
O Top500 mantém uma lista dos maiores supercomputadores do mundo, atualmente o número 1 é o Titan da Cray com 560.640 cores de processamento.
[caption id="attachment_815" align="aligncenter" width="620"] Super computador Titan - Cray com 560.640 cores de processamento.[/caption]
Há implementações para C/C++ e Fortran, e para Java também, mas não tão usada. Neste exemplo usarei o OpenMPI em C.
Felizmente não é necessário um super computador para usar o MPI, você pode usar seu computador de casa para isso, se tiver vários núcleos melhor, mas ele simula caso não tenha, claro que ão terá o desenpenho esperado, mas para fim de teste é suficiente.
Instalação
Para os teste usei uma máquina com Debian 6.
Instale os módulos do OpenMPI, e as bibliotecas de compilação do C.
#apt-get install gcc g++ openmpi-bin openmpi-doc libopenmpi-dev
Para testar você pode enviar um echo para o MPI:
mpirun -np 4 echo oi
A saída será:
oi oi oi oi
O comando mpirun enviou para 4 processos o comando 'echo oi' e cada um escreveu 'oi' na saida.
Código
Exemplo 1
Escreve na tela para cada processo um ola mundo!
#include <stdio.h> #include <stdlib.h> #include <mpi.h> int size, rank; int main(int argc, char *argv[]){ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); printf("Olá eu sou o processo %d de %d\n",rank,size); MPI_Finalize(); }
Salve este arquivo com o nome de olamundo.c por exemplo, compile com o MPI:
mpicc olamundo.c -o olamundo
e execute:
mpirun -np 5 olamundo
a saída será
Olá eu sou o processo 3 de 5 Olá eu sou o processo 4 de 5 Olá eu sou o processo 0 de 5 Olá eu sou o processo 1 de 5 Olá eu sou o processo 2 de 5
Exemplo 2
O primeiro processo envia uma mensagem ponto a ponto para os restantes
#include#include #include int size, rank, msg, source, dest, tag; int main(int argc, char *argv[]){ MPI_Status stat; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); if(rank==0){ msg = 42; dest = 1; tag = 0; int i; for (i=1;i
Salve, compile e execute como o exemplo acima, a saída com 3 processos será:
Processo 0 enviou 42 para 1. Processo 0 enviou 42 para 2. Processo 2 recebeu 42 de 0. Processo 1 recebeu 42 de 0.
Exemplo 3
Neste exemplo o primeiro processo envia uma mensagem em broadcast para os restantes, o resultado será o mesmo do exemplo 2
#include#include #include int size, rank, msg, source, dest, tag; int main(int argc, char *argv[]){ MPI_Status stat; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); if(rank==0){ msg = 42; dest = 1; tag = 0; MPI_Bcast (&msg, 1, MPI_INT, 0, MPI_COMM_WORLD); }else{ MPI_Bcast (&msg, 1, MPI_INT, 0, MPI_COMM_WORLD); printf("%d recebeu a mensagem %d\n",rank,msg); } MPI_Finalize(); }
Salve, compile e execute como o exemplo 1, a saída com 3 processos será:
1 recebeu a mensagem 42 2 recebeu a mensagem 42
Conclusão
Este é o basico do MPI, espero que sirva como um pontapé inicial para quem estiver interessado em aprender mais, tentarei colocar mais exemplos em breve
[]'s
Deixe um comentário