Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.67 KB | None | 0 0
  1. #include<mpi.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5.  
  6. void compareVectors(int * a, int * b, int n) {
  7. // DO NOT MODIFY
  8. int i;
  9. for(i = 0; i < n; i++) {
  10. if(a[i]!=b[i]) {
  11. printf("Sorted incorrectly\n");
  12. return;
  13. }
  14. }
  15. printf("Sorted correctly\n");
  16. }
  17.  
  18. void displayVector(int * v, int n) {
  19. // DO NOT MODIFY
  20. int i;
  21. for(i = 0; i < n; i++) {
  22. printf("%d ", v[i]);
  23. }
  24. printf("\n");
  25. }
  26.  
  27. int cmp(const void *a, const void *b) {
  28. // DO NOT MODIFY
  29. int A = *(int*)a;
  30. int B = *(int*)b;
  31. return A-B;
  32. }
  33.  
  34. int main(int argc, char * argv[]) {
  35. int rank;
  36. int nProcesses;
  37. MPI_Init(&argc, &argv);
  38.  
  39. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  40. MPI_Comm_size(MPI_COMM_WORLD, &nProcesses);
  41. printf("Hello from %i/%i\n", rank, nProcesses);
  42.  
  43. int *v, *vQSort, * v_aux;
  44. int v_size;
  45. MPI_Status status;
  46. int parts, myNumber, myPlace;
  47.  
  48.  
  49. if(rank==0) { // This code is run by a single process
  50. int i;
  51.  
  52. // read the vector v
  53. // DO NOT MODIFY
  54. scanf("%d", &v_size);
  55. v_aux = (int*) calloc(v_size,sizeof(int));
  56. // Alocate memory
  57. vQSort = (int*)malloc(sizeof(int)*v_size);
  58. v = (int*)malloc(sizeof(int)*v_size);
  59.  
  60. for(i = 0; i < v_size; i++)
  61. scanf("%d", &v[i]);
  62.  
  63. // make copy to check it against qsort
  64. // DO NOT MODIFY
  65. for(i = 0; i < v_size; i++)
  66. vQSort[i] = v[i];
  67.  
  68. qsort(vQSort, v_size, sizeof(int), cmp);
  69. // Sending the vector to the other processes
  70. for(i=0 ; i < nProcesses; i++)
  71. {
  72. MPI_Send(&v_size,1 ,MPI_INT,i,0, MPI_COMM_WORLD);
  73. MPI_Send(v,v_size,MPI_INT,i,1,MPI_COMM_WORLD);
  74. }
  75.  
  76. }
  77.  
  78. else
  79. {
  80. // For all the other processes beside rank 0 we recieve the
  81. // size and the vector
  82. MPI_Recv(&v_size,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
  83. v = (int*)calloc(v_size,sizeof(int));
  84.  
  85. MPI_Recv(v,v_size,MPI_INT,0,1,MPI_COMM_WORLD,&status);
  86. }
  87.  
  88. // Spliting the vector in parts;
  89. parts = v_size / nProcesses;
  90. if(rank < nProcesses -1)
  91. {
  92. printf("Sunt rank %d si voi prelucra %d elemente, situate intre indicii: %d si %d\n",rank, parts,rank*parts,rank * parts + parts-1 );
  93. //For every element of the vector that is between the split of the rank we calculate and send the appropiate place in the sorted vector
  94. for(int j = rank * parts; j < rank * parts + parts ; j++)
  95. {
  96. myNumber = v[j];
  97. myPlace = 0;
  98. for(int k = 0; k < v_size; k++)
  99. {
  100. if(myNumber > v[k])
  101. {
  102. myPlace++;
  103. }
  104. }
  105. if(rank != 0 )
  106. {
  107. MPI_Send(&myPlace,1,MPI_INT,0,2,MPI_COMM_WORLD);
  108. MPI_Send(&myNumber,1,MPI_INT,0,3, MPI_COMM_WORLD);
  109. }
  110. else
  111. {
  112. v_aux[myPlace] = myNumber;
  113. for(int k = 1; k < nProcesses-1 ; k++)
  114. {
  115. MPI_Recv(&myPlace,1,MPI_INT,k,2,MPI_COMM_WORLD,&status);
  116. MPI_Recv(&myNumber,1,MPI_INT,k,3,MPI_COMM_WORLD,&status);
  117. v_aux[myPlace] = myNumber;
  118.  
  119. }
  120. }
  121. }
  122. }
  123. else
  124. {
  125. printf("Sunt rank %d si voi prelucra %d elemente, situate intre indicii: %d si %d\n",rank, v_size - (rank*parts),rank*parts,v_size );
  126. for(int j = rank *parts; j < v_size; j++) {
  127. myNumber = v[j];
  128. myPlace = 0;
  129. for(int k = 0 ; k < v_size; k++)
  130. {
  131. if(myNumber > v[k])
  132. myPlace++;
  133. }
  134. MPI_Send(&myPlace,1,MPI_INT,0,2,MPI_COMM_WORLD);
  135. MPI_Send(&myNumber,1,MPI_INT,0,3,MPI_COMM_WORLD);
  136.  
  137. }
  138. }
  139.  
  140. if(rank == 0)
  141. {
  142. for(int j = 0; j < parts + (v_size % nProcesses); j++)
  143. {
  144. MPI_Recv(&myPlace, 1, MPI_INT, nProcesses-1,2,MPI_COMM_WORLD,&status);
  145. MPI_Recv(&myNumber,1,MPI_INT,nProcesses-1,3,MPI_COMM_WORLD,&status);
  146. v_aux[myPlace] = myNumber;
  147. }
  148. }
  149.  
  150.  
  151.  
  152.  
  153. // DO NOT MODIFY
  154. if(rank == 0) {
  155. //displayVector(v_aux, v_size);
  156. compareVectors(v_aux, vQSort, v_size);
  157. }
  158.  
  159. MPI_Finalize();
  160. return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement