Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.90 KB | None | 0 0
  1. #include "mpi.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <time.h>
  6.  
  7. #define CONS 8719
  8. #define MAX_SIZE 9999
  9. #define N 100
  10.  
  11. int init;
  12. int local_primes[MAX_SIZE];
  13. int local_size;
  14.  
  15. void vote(int rank, int size)
  16. {
  17. srand(time(NULL) + CONS * rank);
  18. int myvote = rand() % size;
  19. if (rank == 0) {
  20. MPI_Status status;
  21. int votes[size], i, count[size];
  22. votes[0] = myvote;
  23. for (i = 1; i < size; i++)
  24. MPI_Recv(&votes[i], 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
  25. for (i = 0; i < size; i++)
  26. count[i] = 0;
  27. for (i = 0; i < size; i++)
  28. count[votes[i]]++;
  29. int max = count[0];
  30. init = 0;
  31. for (i = 1; i < size; i++)
  32. if (count[i] > max) {
  33. init = i;
  34. max = count[i];
  35. }
  36. MPI_Bcast(&init, 1, MPI_INT, 0, MPI_COMM_WORLD);
  37. }
  38. else {
  39. MPI_Send(&myvote, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
  40. MPI_Bcast(&init, 1, MPI_INT, 0, MPI_COMM_WORLD);
  41. }
  42. MPI_Barrier(MPI_COMM_WORLD);
  43. }
  44.  
  45. int is_prime(int nr)
  46. {
  47.  
  48. if (local_size == 0)
  49. return 1;
  50. int i;
  51.  
  52. for (i = 0; i < local_size; i++)
  53. if (nr % local_primes[i]== 0)
  54. return 0;
  55. return 1;
  56. }
  57.  
  58. int main(int argc, char **argv) {
  59. int rank, size;
  60. int prev, next;
  61.  
  62. MPI_Init(&argc, &argv);
  63. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  64. MPI_Comm_size(MPI_COMM_WORLD, &size);
  65.  
  66. prev = (rank - 1) % size;
  67. next = (rank + 1) % size;
  68. if (rank == 0)
  69. prev = size - 1;
  70.  
  71. vote(rank, size);
  72. int i, count = 0;
  73. MPI_Status status;
  74. int sizep;
  75. sizep = size - ((rank-init)%size);
  76. if(rank!=init)
  77. printf("%d %d\n",rank,sizep);
  78. MPI_Barrier(MPI_COMM_WORLD);
  79.  
  80.  
  81. /******************************************************************************/
  82. /* procesul initiator */
  83. /******************************************************************************/
  84.  
  85. if (rank == init){
  86. int rec, s = 1;
  87. MPI_Request req;
  88. for (i = 2; i <= N; i++) {
  89.  
  90. MPI_Send(&i, 1, MPI_INT, next, 1, MPI_COMM_WORLD);
  91. int ok = 1, prime;
  92. while(ok) {
  93. if(s)
  94. MPI_Irecv(&rec, 1, MPI_INT, prev, MPI_ANY_TAG, MPI_COMM_WORLD, &req);
  95. MPI_Test(&req, &s, &status);
  96.  
  97. //procesul initiator primeste un mesaj
  98. if (s) {
  99.  
  100. switch(status.MPI_TAG) {
  101. //am primit un nr prim
  102. case 1:
  103. ok = 0;
  104. prime = is_prime(rec);
  105.  
  106. if(prime) {
  107.  
  108. if (count % size == 0){
  109. local_primes[local_size++] = rec;
  110. }
  111. else
  112. MPI_Send(&rec, 1, MPI_INT, next, 2, MPI_COMM_WORLD);
  113. count ++;
  114. }
  115. break;
  116. //am primit un nr neprim
  117. case 4:
  118. ok = 0;
  119. break;
  120. case 3:
  121. //am primit mesaj de finalizare
  122. ok = 0;
  123. MPI_Send(&rec, 1, MPI_INT, next, 3, MPI_COMM_WORLD);
  124. break;
  125. default:
  126. ok = 0;
  127. break;
  128. }
  129. }
  130. }
  131. }
  132. MPI_Send(&rec, 1, MPI_INT, next, 3, MPI_COMM_WORLD);
  133. #if 0
  134. while(1) {
  135. if(s)
  136. MPI_Irecv(&rec, 1, MPI_INT, prev, MPI_ANY_TAG, MPI_COMM_WORLD, &req);
  137. MPI_Test(&req, &s, &status);
  138. if (s) {
  139. if (status.MPI_TAG == 3) {
  140. MPI_Send(&rec, 1, MPI_INT, next, 3, MPI_COMM_WORLD);
  141. break;
  142. }
  143. printf("am primit %d\n",rec);
  144. if (count % size == 0)
  145. local_primes[local_size++] = rec;
  146. else
  147. MPI_Send(&rec, 1, MPI_INT, next, 2, MPI_COMM_WORLD);
  148. count ++;
  149. }
  150. }
  151. #endif
  152. }
  153. else {
  154. int nr;
  155. int ok = 1;
  156. int prime;
  157. while(ok) {
  158. MPI_Recv(&nr, 1, MPI_INT, prev, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
  159. //printf("r=%d nr=%d tag=%d\n",rank, nr, status.MPI_TAG);
  160. //daca e mesaj de verificare
  161. switch(status.MPI_TAG){
  162. //mesaj de test
  163. case 1:
  164. prime = is_prime(nr);
  165.  
  166. if (prime) {
  167. MPI_Send(&nr, 1, MPI_INT, next, 1, MPI_COMM_WORLD);
  168. }
  169. else
  170. MPI_Send(&nr, 1, MPI_INT, next, 4, MPI_COMM_WORLD);
  171. if (nr == N && prime == 0)
  172. MPI_Send(&nr, 1, MPI_INT, next, 3, MPI_COMM_WORLD);
  173. break;
  174. case 2:
  175. if(nr == 89) printf("te-am prins\n");
  176. if (count % sizep == 0) {
  177. local_primes[local_size++] = nr;
  178. MPI_Send(&nr, 1, MPI_INT, next, 4, MPI_COMM_WORLD);
  179. }
  180. else {
  181. MPI_Send(&nr, 1, MPI_INT, next, 2, MPI_COMM_WORLD);
  182. }
  183. count++;
  184. break;
  185. case 4:
  186.  
  187. MPI_Send(&nr, 1, MPI_INT, next, 4, MPI_COMM_WORLD);
  188. break;
  189. case 3:
  190. ok = 0;
  191. MPI_Send(&nr, 1, MPI_INT, next, 3, MPI_COMM_WORLD);
  192. break;
  193. }
  194. }
  195. }
  196.  
  197. if (rank == init) {
  198. printf("%d : ",rank);
  199. for (i = 0; i < local_size; i++)
  200. printf("%d ", local_primes[i]);
  201. printf("\n");
  202. fflush(stdout);
  203. MPI_Send(&i, 1, MPI_INT, next, 1, MPI_COMM_WORLD);
  204. }
  205. else {
  206. MPI_Recv(&i, 1, MPI_INT, prev, 1, MPI_COMM_WORLD, &status);
  207. printf("%d : ",rank);
  208. for (i = 0; i < local_size; i++)
  209. printf("%d ", local_primes[i]);
  210. printf("\n");
  211. fflush(stdout);
  212. MPI_Send(&i, 1, MPI_INT, next, 1, MPI_COMM_WORLD);
  213. }
  214.  
  215. MPI_Finalize();
  216. return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement