Advertisement
Guest User

Untitled

a guest
Nov 19th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. /*
  2. ============================================================================
  3. Name : laborator1.c
  4. Author :Par Impar
  5. Version :
  6. Copyright : Your copyright notice
  7. Description : Hello MPI World in C
  8. ============================================================================
  9. */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include "mpi.h"
  13.  
  14. int main(int argc, char* argv[]){
  15. int my_rank; /* rank of process */
  16. int p; /* number of processes */
  17. int source; /* rank of sender */
  18. int dest; /* rank of receiver */
  19. int tag=0; /* tag for messages */
  20. char message[100]; /* storage for message */
  21. MPI_Status status ; /* return status for receive */
  22.  
  23. /* start up MPI */
  24.  
  25. MPI_Init(&argc, &argv);
  26.  
  27. /* find out process rank */
  28. MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
  29.  
  30. /* find out number of processes */
  31. MPI_Comm_size(MPI_COMM_WORLD, &p);
  32.  
  33.  
  34. /*
  35. Date de intrare pentru algoritm
  36. */
  37. int A[6] = {3,2,1,6,4,8};
  38.  
  39.  
  40. for(int i=0;i<p;i++)
  41. {
  42. // faza PARA
  43. if((i&0x01) == 0x00)
  44. {
  45. if(my_rank == 0)
  46. printf("*Runda PARA!\n");
  47. MPI_Barrier(MPI_COMM_WORLD);
  48. if(my_rank%2 ==0)
  49. {
  50. //comunica cu fratele + 1
  51. int val;
  52. if(my_rank+1<p){
  53. MPI_Send(A+my_rank,1,MPI_INT,my_rank+1,0,MPI_COMM_WORLD);
  54. printf(">>Procesorul %d a trimis mesaj procesorului %d.(%d)\n",my_rank,my_rank+1,A[my_rank]);
  55. MPI_Recv(&val,1,MPI_INT,my_rank+1,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
  56. printf("<<Procesorul %d a primit mesaj de la procesorul %d.(%d)\n",my_rank,my_rank+1,val);
  57. if(val < A[my_rank])
  58. A[my_rank] = val;
  59. }
  60.  
  61. }
  62. else
  63. {
  64. //comunica cu fratele - 1
  65. int val;
  66. if(my_rank-1>=0){
  67. MPI_Send(A+my_rank,1,MPI_INT,my_rank-1,0,MPI_COMM_WORLD);
  68. printf(">>Procesorul %d a trimis mesaj procesorului %d.(%d)\n",my_rank,my_rank+1,A[my_rank]);
  69. MPI_Recv(&val,1,MPI_INT,my_rank-1,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
  70. printf("<<Procesorul %d a primit mesaj de la procesorul %d.(%d)\n",my_rank,my_rank-1,val);
  71. if(val > A[my_rank])
  72. A[my_rank] = val;
  73. }
  74.  
  75. }
  76. }
  77. // faza impara
  78. else
  79. {
  80. if(my_rank == 0)
  81. printf("*Runda IMPARA!\n");
  82. MPI_Barrier(MPI_COMM_WORLD);
  83.  
  84. if(my_rank%2 ==1)
  85. {
  86. //comunica cu fratele + 1
  87. int val;
  88. if(my_rank+1 < p){
  89. MPI_Send(A+my_rank,1,MPI_INT,my_rank+1,0,MPI_COMM_WORLD);
  90. printf(">>Procesorul %d a trimis mesaj procesorului %d.(%d)\n",my_rank,my_rank+1,A[my_rank]);
  91. MPI_Recv(&val,1,MPI_INT,my_rank+1,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
  92. printf("<<Procesorul %d a primit mesaj de la procesorul %d.(%d)\n",my_rank,my_rank+1,val);
  93. if(val < A[my_rank])
  94. A[my_rank] = val;
  95. }
  96. }
  97. else
  98. {
  99. //comunica cu fratele - 1
  100. int val;
  101. if(my_rank-1>=0){
  102. MPI_Send(A+my_rank,1,MPI_INT,my_rank-1,0,MPI_COMM_WORLD);
  103. printf(">>Procesorul %d a trimis mesaj procesorului %d.(%d)\n",my_rank,my_rank-1,A[my_rank]);
  104. MPI_Recv(&val,1,MPI_INT,my_rank-1,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
  105. printf("<<Procesorul %d a primit mesaj de la procesorul %d.(%d)\n",my_rank,my_rank-1,val);
  106. if(val > A[my_rank])
  107. A[my_rank] = val;
  108. }
  109. }
  110. }
  111. MPI_Barrier(MPI_COMM_WORLD);
  112. }
  113. if(my_rank == 0)
  114. {
  115. printf("%d ",A[0]);
  116. for(int i=1;i<p;i++)
  117. {
  118. MPI_Recv(A+i,1,MPI_INT,i,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
  119. printf("%d ",A[i]);
  120. }
  121. printf("\n");
  122.  
  123. }
  124. else{
  125. MPI_Send(A+my_rank,1,MPI_INT,0,0,MPI_COMM_WORLD);
  126. }
  127. /* shut down MPI */
  128. MPI_Finalize();
  129.  
  130.  
  131. return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement