Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.04 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;
  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. int count = v_size / nProcesses;
  67. //printf("eu voi avea de la 0 la %d\n", count);
  68. int index = count;
  69. for (i = 1; i < nProcesses; i++) {
  70. if (i != nProcesses -1) {
  71. //printf("Trimit de la index %d %d elemente\n", index, count);
  72. MPI_Send(&index, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
  73. MPI_Send(&count, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
  74. MPI_Send(&v_size, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
  75. MPI_Send(v, v_size, MPI_INT, i, 1, MPI_COMM_WORLD);
  76. index += count;
  77. }
  78. else {
  79. count = v_size - ((v_size / nProcesses) * (nProcesses-1));
  80. //printf("*Trimit de la index %d, %d elemente\n", index, count);
  81. MPI_Send(&index, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
  82. MPI_Send(&count, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
  83. MPI_Send(&v_size, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
  84. MPI_Send(v, v_size, MPI_INT, i, 1, MPI_COMM_WORLD);
  85. index += count;
  86. }
  87. }
  88.  
  89. }
  90.  
  91. else {
  92. int count, size, index = 0;
  93. MPI_Recv(&index, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  94. MPI_Recv(&count, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  95. MPI_Recv(&size, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  96. int* myvec = (int*) malloc(size*sizeof(int));
  97. MPI_Recv(myvec, size, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  98. printf("rank %d, myvec: ", rank);
  99. int i;
  100. for (i = 0; i < size; i++) {
  101. printf("%d ", myvec[i]);
  102. }
  103. printf("SUnt rank %d si procesez de la %d pana la %d\n", index, coun
  104.  
  105. printf("\n");
  106. //printf("Sunt in ranku %d si primesc countul %d\n", rank, count);
  107. }
  108.  
  109. // HERE YOU DO YOUR MAGIC, SO RANK == 0 to have the vector
  110. // sorted at the end.
  111.  
  112.  
  113.  
  114. // DO NOT MODIFY
  115. if(rank == 0) {
  116. // displayVector(v, v_size);
  117. compareVectors(v, vQSort, v_size);
  118. }
  119.  
  120. MPI_Finalize();
  121. return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement