Advertisement
Guest User

Untitled

a guest
Dec 7th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.54 KB | None | 0 0
  1. int main(int argc, char* argv[])
  2. {
  3. int* data;
  4. int* blk;
  5. int* temp;
  6. int m, n = N;
  7. int id = 0, p;
  8. int s = 0;
  9. int i;
  10. int step;
  11. MPI_Status status;
  12. MPI_Init(&argc, &argv);
  13. MPI_Comm_rank(MPI_COMM_WORLD, &id);
  14. MPI_Comm_size(MPI_COMM_WORLD, &p);
  15. startT = MPI_Wtime();
  16. int r;
  17. srand(MPI_Wtime());
  18. s = n / p;
  19. r = n%p;
  20. data = (int*)malloc((n + s - r) * sizeof(int));
  21. for (i = 0; i < n; i++)
  22. data[i] = rand();
  23. if (r != 0)
  24. {
  25. for (i = n; i < n + s - r; i++)
  26. data[i] = 0;
  27. s++;
  28. }
  29. if (id == MASTER)
  30. {
  31.  
  32. MPI_Bcast(&s, 1, MPI_INT, 0, MPI_COMM_WORLD);
  33. blk = (int*)malloc(s * sizeof(int));
  34. MPI_Scatter(data, s, MPI_INT,blk, s, MPI_INT, 0, MPI_COMM_WORLD);
  35. merge_sort(blk, 0, s - 1);
  36. }
  37. else
  38. {
  39. MPI_Bcast(&s, 1, MPI_INT, 0, MPI_COMM_WORLD);
  40. blk = (int*)malloc(s * sizeof(int));
  41. MPI_Scatter(data, s, MPI_INT, blk, s, MPI_INT, 0, MPI_COMM_WORLD);
  42. merge_sort(blk, 0, s - 1);
  43. }
  44. step = 1;
  45. while (step < p)
  46. {
  47. if (id % (2 * step) == 0)
  48. {
  49. if (id + step < p)
  50. {
  51. MPI_Recv(&m, 1, MPI_INT, id + step, 0, MPI_COMM_WORLD, &status);
  52. temp = new int[m];
  53. MPI_Recv(temp, m, MPI_INT, id + step, 0, MPI_COMM_WORLD, &status);
  54. blk = merge(blk, s, temp, m);
  55. s += m;
  56. }
  57. }
  58. else
  59. {
  60. int near = id - step;
  61. MPI_Send(&s, 1, MPI_INT, near, 0, MPI_COMM_WORLD);
  62. MPI_Send(blk, s, MPI_INT, near, 0, MPI_COMM_WORLD);
  63. break;
  64. }
  65. step *= 2;
  66. }
  67. stopT = MPI_Wtime();
  68. printf("%d; %d processors; %f scecs\n", s, p, (stopT - startT));
  69. MPI_Finalize();
  70. return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement