Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.07 KB | None | 0 0
  1. #include<mpi/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("\nSorted incorrectly\n");
  12. return;
  13. }
  14. }
  15. printf("\nSorted 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;
  44. int v_size;
  45.  
  46. if(rank==0) { // This code is run by a single process
  47. int i;
  48.  
  49. // read the vector v
  50. // DO NOT MODIFY
  51. scanf("%d", &v_size);
  52.  
  53. // Alocate memory
  54. vQSort = (int*)malloc(sizeof(int)*v_size);
  55. v = (int*)malloc(sizeof(int)*v_size);
  56.  
  57. for(i = 0; i < v_size; i++)
  58. scanf("%d", &v[i]);
  59.  
  60. // make copy to check it against qsort
  61. // DO NOT MODIFY
  62. for(i = 0; i < v_size; i++)
  63. vQSort[i] = v[i];
  64.  
  65. qsort(vQSort, v_size, sizeof(int), cmp);
  66.  
  67. }
  68.  
  69. // HERE YOU DO YOUR MAGIC, SO RANK == 0 to have the vector
  70. // sorted at the end.
  71.  
  72. if (rank == 0)
  73. {
  74. for (int i = 1; i < nProcesses; i++)
  75. {
  76. MPI_Send(&v_size, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
  77. MPI_Send(v, v_size, MPI_INT, i, 0, MPI_COMM_WORLD);
  78. }
  79. int step = v_size / nProcesses;
  80. int * aux = (int*) calloc(v_size, sizeof(int));
  81. int * vecCopy = (int*) malloc(v_size * sizeof(int));
  82. printf("Eu, procesul %d, voi prelucra intre %d si %d\n", rank, 0, step-1);
  83. for (int i = 0 ; i < step; i++)
  84. {
  85. for (int j = 0; j < v_size; j++)
  86. if (v[i] > v[j])
  87. aux[i]++;
  88. vecCopy[aux[i]] = v[i];
  89. }
  90. displayVector(vecCopy, v_size);
  91. for (int i = 0 ; i < step; i++)
  92. printf("Rank %d : poz din v : %d, pozitia corecta : %d\n", rank, v[i], aux[i]);
  93. for (int i = 1 ; i < nProcesses-1; i++)
  94. {
  95. MPI_Recv(aux, step, MPI_INT, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  96. displayVector(aux, step);
  97. for (int j = 0 ; j < step; j++)
  98. vecCopy[aux[j]] = v[i*step + j];
  99. printf("Dupa pasul %i\n", i);
  100. displayVector(vecCopy, v_size);
  101. }
  102. MPI_Recv(aux, v_size - ((nProcesses-1) * step), MPI_INT, nProcesses-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  103. displayVector(aux, v_size - ((nProcesses-1) * step));
  104.  
  105. for (int j = 0 ; j < v_size - ((nProcesses-1) * step); j++)
  106. vecCopy[aux[j]] = v[(nProcesses-1)*step+j];
  107. printf("Dupa pasul %i\n", nProcesses-1);
  108. displayVector(vecCopy, v_size);
  109. for (int i = 0 ; i < v_size ; i++)
  110. {
  111. v[i] = vecCopy[i];
  112. printf("%d ", v[i]);
  113. }
  114. }
  115. else
  116. {
  117. MPI_Recv(&v_size, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  118. v = (int*)malloc(sizeof(int)*v_size);
  119. MPI_Recv(v, v_size, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  120. int step = v_size / nProcesses;
  121. if ( rank < nProcesses -1 )
  122. {
  123. int step = v_size / nProcesses;
  124. int * aux = (int*) calloc(v_size, sizeof(int));
  125. printf("Eu, procesul %d, voi prelucra intre %d si %d\n", rank, step*rank, step*(rank+1)-1);
  126. for (int i = step * rank ; i < step * (rank+1); i++)
  127. for (int j = 0 ; j < v_size; j++)
  128. if (v[i] > v[j])
  129. aux[i]++;
  130. for (int i = step * rank ; i < step * (rank+1); i++)
  131. printf("Rank %d : poz din v : %d, pozitia corecta : %d\n", rank, v[i], aux[i]);
  132. printf("Eu, procesul %d, trimit inapoi intre %d si %d\n", rank, step*rank, step*(rank+1)-1);
  133. MPI_Send(&aux[step*rank], step, MPI_INT, 0, 0, MPI_COMM_WORLD);
  134. }
  135. else
  136. {
  137. int step = v_size / nProcesses;
  138. int * aux = (int*) calloc(v_size, sizeof(int));
  139. printf("Eu, procesul %d, voi prelucra intre %d si %d\n", rank, step*rank, v_size);
  140. for (int i = step * rank ; i < v_size; i++)
  141. for (int j = 0 ; j < v_size; j++)
  142. if (v[i] > v[j])
  143. aux[i]++;
  144. for (int i = step * rank ; i < v_size; i++)
  145. printf("Rank %d : poz din v : %d, pozitia corecta : %d\n", rank, v[i], aux[i]);
  146. printf("Eu, procesul %d, trimit inapoi intre %d si %d\n", rank, step*rank, step*(rank+1)-1);
  147. MPI_Send(&aux[step*rank], v_size - step * rank, MPI_INT, 0, 0, MPI_COMM_WORLD);
  148. }
  149. }
  150. // DO NOT MODIFY
  151. if(rank == 0) {
  152. // displayVector(v, v_size);
  153. compareVectors(v, vQSort, v_size);
  154. }
  155.  
  156. MPI_Finalize();
  157. return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement