Olá Mundo com MIP em C

3 minutos de leitura

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. 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