Ricart-Agrawala simples
O algoritmo de ricart-agrawala é um algoritmo para exclusão mutua num sistema distribuído. Esta é uma implementação em C usando o padrão MPI.
Código-fonte
#include
#include
#include "mpi.h"
#define N 4
enum tags { request= 0, reply};
int my_rank;
int size;
MPI_Request send_reqs[N];
MPI_Request recv_reqs[N];
MPI_Status send_stats[N];
MPI_Status recv_stats[N];
int deferred[N];
void critical_section(){
char *poema[] = {"Minha terra tem palmeiras,",
"Onde canta o Sabia;",
"As aves, que aqui gorjeiam,",
"Nao gorjeiam como la."};
printf("[%d] %s\n", my_rank, poema[my_rank]);
}
void master_job(){
if(sizeN)
printf("Too many processes. ");
if((size N)){
printf("This program should be initialized with %d processes.\n", N);
printf("Example:\n");
printf("mpirun -np %d ricart_agrawala\n", N);
MPI_Finalize();
exit(-1);
}
#ifdef DEBUG
printf("Initializing %d processes...\n", size);
#endif
}
int main(int argc, char **argv){
int i, output, input[N], who, input_buffer, replies, ticket;
MPI_Status tmp;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size (MPI_COMM_WORLD, &size);
if(my_rank == 0)
master_job();
for(i=0;i
Código-fonte para download, ricart_agrawala_simple.tar.bz2.
Para executar este exemplo é necessário ter uma implementação do MPI funcionando (MPICH ou LAM por exemplo).
Para instalar a MPICH no Ubuntu 7.04 eu usei:
sudo apt-get install openmpi-bin openmpi-common openmpi-dev openmpi-libs0 libmpich1.0c2 libmpich-mpd1.0c2 mpich-bin mpich-mpd-bin mpi-doc
Para compilar esse programa:
mpicc ricart_agrawala.c -o ricart_agrawala
E para rodar use o mpirun:
mpirun -np 4 ./ricart_agrawala
Isso vai rodar 4 processos do binário.
obs: Nesse pacote há dois scripts, compile.sh e run.sh, para facilitar o trabalho de compilação e execução.
Para saber mais:
Palavras-chave: MPI, c, programação distribuída, problema da seção crítica, exclusão mútua, MPI_Isend, MPI_Irecv, MPI_Wait, MPI_Waitall, MPI_Send.



about 1 year ago
tô tendo erro com essa linha
MPI_Request send_reqs[N];
syntax error before “send_reqs”
o que pode ser?