/* CS521 Parallel Algorithms & Archiecture Assignment 1 Sorting & merging a list of numbers. Version 2 - with N number of processes. Author: Anirban Sinha, anirbans@cs.ubc.ca */ #include "mpi.h" #include #include #include void merge(int *dat1, int *dat2, int *merge, int datsize1,int datsize2); static void sorting_list(int); int compfunc(int *i, int *j); static void initialize(int,int,int); void printint(int *s,int size); #define WORKTAG 1 #define DIETAG 2 #define CHBUFFTAG 3 #define NUM 100 int main(int argc, char** argv) { int myrank,part,wpart, n; /* number of processes */ MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &n); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if(n==1){ printf("You must initiate atleast 2 processes\n"); exit(0); } part=NUM/(n-1); wpart=NUM%(n-1); if(myrank==0) { printf("Parallel merge sort initiated\nwith %d worker processes and 1 root process\n",n-1); printf("# of random numbers initialized: %d\n",NUM); initialize(n,part,wpart); } else { sorting_list(part); } MPI_Finalize(); return 0; } static void initialize(int n,int part,int wpart) { int i; int j; int start=0; int *sorted_array; int *buf; MPI_Status status; sorted_array=(int*) malloc(NUM*sizeof(int)); buf=(int*) malloc((NUM)*sizeof(int)); for(i=0;i=datsize1){ *(merge+i)=*(dat2++); datcnt2++; continue; } if(datcnt2>=datsize2){ *(merge+i)=*(dat1++); datcnt1++; continue; } if(*dat1==*dat2) {/* Hmm, two values in an array can be same */ *(merge+i++)=*(dat1++); *(merge+i)=*(dat2++); datcnt1++; datcnt2++; } else if(*dat1<*dat2) { *(merge+i)=*(dat1++); datcnt1++; } else if (*dat2<*dat1) { *(merge+i)=*(dat2++); datcnt2++; } } } void printint(int *s,int size) { while(size) { printf("%d ",*s++); size--; } printf("\n"); }