#include #include #include #include "mpi.h" #define TAM 120 #define DELTA 20 int *juntar(int *v1,int n1,int *v2,int n2); void quicksort(int * v,int esq,int dir); void trocaelemento(int *v,int i,int j); main(int argc, char** argv) { int my_rank; //identificador do processo int proc_n; //numero de processos int metade, resto, resto2; int i,j; int *vetor,*vet1, *vet2, *vet3, *vet4; double tempoInicial,tempoFinal; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &proc_n); // INICIO DO NIVEL INICIAL (PROCESSO 0) if (my_rank == 0) { vetor = (int *) malloc(TAM*(sizeof(int))); vet1 = (int *) malloc((TAM/2)*(sizeof(int))); vet2 = (int *) malloc((TAM/2)*(sizeof(int))); tempoInicial = MPI_Wtime(); srand(time(NULL)); for (i=0;i= DELTA) { for (i=0;i 0) && (my_rank <=2)) { vet1 = (int *) malloc((TAM/2)*(sizeof(int))); metade = TAM/2; MPI_Recv(vet1,metade,MPI_INT,0,0,MPI_COMM_WORLD,&status); printf("\n Rank %d: recebimento de cima (processo 0) de %d elementos do vetor concluido!\n",my_rank,metade); metade = metade/2; if (metade >= DELTA) { vet3 = (int *)malloc ((metade)*sizeof(int)); vet4 = (int *)malloc ((metade)*sizeof(int)); printf("\n Rank %d: vai enviar %d elementos do vetor para os ranks: %d e %d\n",my_rank,metade,(my_rank*2)+1,(my_rank*2)+2); for(i=0;i 2) { metade = TAM/4; vet3 = (int *)malloc ((metade)*sizeof(int)); resto = (my_rank % 2); if (resto == 0) //se my_rank é par { MPI_Recv(vet3,metade,MPI_INT,(my_rank-2)/2,0,MPI_COMM_WORLD,&status); printf("\n Rank %d: recebeu do rank %d %d elementos do vetor\n", my_rank,(my_rank-2)/2,metade); } else { MPI_Recv(vet3,metade,MPI_INT,(my_rank-1)/2,0,MPI_COMM_WORLD,&status); printf("\n Rank %d: recebeu do rank %d %d elementos do vetor\n", my_rank,(my_rank-1)/2,metade); } quicksort(vet3,0,metade); resto2 = (my_rank % 2); if (resto2 == 0) //se my_rank é par { MPI_Send(vet3,metade,MPI_INT,(my_rank-2)/2,0, MPI_COMM_WORLD); printf("\n Rank %d: enviou de volta para rank %d %d elementos do vetor\n",my_rank,(my_rank-2)/2, metade); } else { MPI_Send(vet3,metade,MPI_INT,(my_rank-1)/2,0, MPI_COMM_WORLD); printf("\n Rank %d: enviou de volta para rank %d %d elementos do vetor\n",my_rank,(my_rank-1)/2,metade); } } // FIM DO NIVEL FOLHA (PROCESSOS 3, 4, 5 E 6) MPI_Finalize(); return(0); } void trocaelemento(int *v,int i,int j){ int t; t = v[i]; v[i] = v[j]; v[j] = t; } void quicksort(int * v,int esq,int dir){ int i,ult; if(esq>=dir) return; trocaelemento(v,esq,(esq + dir)/2); ult = esq; for(i=esq+1;i<= dir;i++) if(v[i]