Advertisement
Guest User

ppr3

a guest
Nov 15th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.87 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <algorithm>
  4. #include<stdlib.h>
  5. #include <time.h>
  6. #include <mpi.h>
  7. #include <cmath>
  8.  
  9. #define MASTER 0
  10. using namespace std;
  11. void bubblesort(int *v, int n);
  12. int* merge(int* v1, int n1, int* v2, int n2);
  13.  
  14. int main(int argc, char **argv) {
  15.  
  16. MPI_Init(&argc, &argv);
  17. int n=100;
  18. int *a = new int[n];
  19. int rank,size,length;
  20. int kawalki;
  21. int *data = NULL;
  22. int buforN;
  23. int *bufor = NULL;
  24. int *kawalki_wys = NULL;
  25. char hostname[MPI_MAX_PROCESSOR_NAME];
  26. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  27. MPI_Comm_size(MPI_COMM_WORLD, &size);
  28. MPI_Get_processor_name(hostname, &length);
  29.  
  30.  
  31.  
  32. if(rank == MASTER){
  33. srand(time(NULL));
  34.  
  35. //if (n%size == 0){
  36. // kawalki = n/size; //n=8 size=3 8/3=2
  37. // }else{
  38. // kawalki = ceil((double)n/size);
  39. // }
  40. kawalki = n/size;
  41. if(n%size!=0){
  42. kawalki++;
  43. }
  44. cout<<"Kawalki: "<< kawalki <<endl;
  45.  
  46. data = new int[size*kawalki];
  47. cout << "Tablica wyjsciowa " << endl;
  48. // for (int i = 0; i<size*kawalki; i++) {
  49. //a[i] = rand() % 1000;
  50. //if(i < n){
  51. // data[i] = rand() %1000;
  52. // } else{
  53. // data[i] = 0;
  54. // }
  55.  
  56.  
  57. // }
  58. for(int i=0; i<n; i++){
  59. data[i] = rand() %1000;
  60. cout << data[i] << endl;
  61. }
  62. for(int i=n; i<size*kawalki; i++){
  63. data[i] = 0;
  64. //cout << data[i] << endl;
  65. }
  66.  
  67.  
  68. }
  69. MPI_Barrier(MPI_COMM_WORLD);
  70. double timestart = MPI_Wtime();
  71.  
  72. MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
  73.  
  74. //if (n%size == 0){
  75. // kawalki = n/size; //n=8 size=3 8/3=2
  76. // }else{
  77. // kawalki = ceil((double)n/size);
  78. // }
  79. kawalki = n/size;
  80. if(n%size!=0){
  81. kawalki++;
  82. }
  83. bufor = new int[kawalki];
  84.  
  85. MPI_Scatter(data, kawalki, MPI_INT, bufor, kawalki, MPI_INT, 0, MPI_COMM_WORLD);
  86. /*
  87. cout<<"Bufor dla procesu: "<< rank <<endl;
  88. for(int i=0; i<kawalki; i++){
  89. cout<<bufor[i]<<endl;
  90. }
  91. */
  92. delete[] data;
  93. data = NULL;
  94.  
  95. if(size-1!=rank){
  96. buforN = kawalki;
  97. }else{
  98. buforN = n - kawalki*rank;
  99. }
  100.  
  101. //if(n>=kawalki*(rank+1))
  102.  
  103. bubblesort(bufor, buforN);
  104. /*
  105. cout<<"==============="<<endl;
  106. cout<<"Posortowany Bufor dla procesu: "<< rank <<endl;
  107. for(int i=0; i<buforN; i++){
  108. cout<<bufor[i]<<endl;
  109. }
  110. cout<<"==============="<<endl;
  111. */
  112. int krok;
  113. int s_wys;
  114. for(krok=1; krok<size; krok=krok*2){ //tu wejdzie 1 3 5
  115. if((rank % (2*krok))!=0){
  116. MPI_Send(bufor, buforN, MPI_INT, rank-krok,0,MPI_COMM_WORLD);
  117. break;
  118. }
  119. if(rank + krok < size){
  120. if(n >= kawalki * ( rank+2*krok )){ //czy to dziala i dlczego czy id+krok
  121. s_wys = kawalki * krok;
  122. }else{
  123. s_wys = n-(kawalki*(rank+krok));
  124. }
  125. kawalki_wys = new int[s_wys];
  126. MPI_Status status;
  127. MPI_Recv(kawalki_wys, s_wys, MPI_INT, rank+krok, 0, MPI_COMM_WORLD, &status);
  128. data = merge(bufor, buforN, kawalki_wys, s_wys);
  129. delete[] bufor;
  130. delete[] kawalki_wys;
  131. bufor = data;
  132. buforN = buforN+s_wys;
  133. //bubblesort(bufor, buforN);
  134.  
  135. }
  136. }
  137.  
  138.  
  139. if(rank == MASTER){
  140. cout<<"\nTablica posortowana o wielkosci "<<buforN<<endl;
  141. for(int i=0; i<buforN; i++ ){
  142. cout<< bufor[i]<<endl;
  143. }
  144. cout<<"\nLiczba procesow: "<<size<<endl;
  145. cout<<"Czas: "<<MPI_Wtime()-timestart<<endl;
  146. }
  147.  
  148. //cout << "Tablica a posortowana " << endl;
  149. //for (int i = 0; i<n; i++) cout << a[i] << endl;
  150.  
  151. MPI_Finalize();
  152. return 0;
  153. }
  154.  
  155. void bubblesort(int *v, int n){
  156. for (int i = n - 2; i >= 0; i--)
  157. for (int j = 0; j <= i; j++)
  158. if (v[j] > v[j + 1]){
  159. swap(v[j], v[j + 1]);
  160. }
  161. }
  162.  
  163. int* merge(int* v1, int n1, int* v2, int n2){
  164. int *merged = new int[n1+n2];
  165.  
  166. int i=0;
  167. int j=0;
  168. int k;
  169.  
  170. for(k=0; k<n1+n2; k++){
  171. if(i>= n1){
  172. merged[k]=v2[j];
  173. j++;
  174. }
  175. else if(j >= n2){
  176. merged[k]=v2[i];
  177. i++;
  178. }
  179. else if(v1[i]<v2[j]){
  180. merged[k]=v1[i];
  181. i++;
  182. }
  183. else{ //v2[j] <= v1[i]
  184. merged[k] = v2[j];
  185. j++;
  186. }
  187. }
  188.  
  189. return merged;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement