sagak

mpi

Nov 30th, 2016
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.30 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fstream>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <mpi.h>
  7. #include <math.h>
  8. #include <iostream>
  9. using namespace std;
  10. float time2;
  11. void matvec(double *mat, double *vec, int N, int loc_rows, double *res);
  12. void multpar(double *a, double *v,double *c, int n);
  13. void matrix(double *a, int n);
  14. void vecter( double *v,int n);
  15. void coutt(double *a, int n);
  16. double scalarproduct(double *a,double *b, int n);
  17. void multiply(double *a, double b, double *c, int n);
  18. void sum(double *a, double*b, double *c,char p, int n);
  19. void ort(double *w,double *v,int k, int num);
  20. void mainn(int num, int k);
  21. int processor=4;
  22. int main(int argc, char* argv[])
  23. {
  24. int k=500,n=100, l=0;
  25. MPI_Init(&argc, &argv);
  26. ofstream fout("result256.txt",ios::app );
  27. //for(int k=700;k<=700;k=k+100)
  28. int size, rank;
  29. MPI_Comm_size(MPI_COMM_WORLD, &size);
  30. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  31. double f;
  32.  
  33. for(n=1000;n<=15000;n=n+1000)
  34. {
  35. float start_time,end_time;
  36.  
  37. start_time=MPI_Wtime();
  38. mainn(n,k);
  39. int rank,size ;
  40. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  41. end_time=MPI_Wtime();
  42. float time=float(end_time-start_time);
  43. time2=float(end_time-time2);
  44. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  45. MPI_Comm_size(MPI_COMM_WORLD, &size);
  46. if(rank==0)
  47. {
  48. fout<<size<<" "<<time<<" "<<time2<<" "<<n<<endl;
  49. fout<<endl;
  50. }
  51. }
  52. for(n=17000;n<=25000;n=n+4000)
  53. {
  54. l=0;
  55. float start_time,end_time;
  56.  
  57. start_time=MPI_Wtime();
  58. mainn(n,k);
  59. int rank,size ;
  60. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  61. end_time=MPI_Wtime();
  62. float time=float(end_time-start_time);
  63. time2=float(end_time-time2);
  64. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  65. MPI_Comm_size(MPI_COMM_WORLD, &size);
  66. if(rank==0)
  67. {
  68. fout<<size<<" "<<time<<" "<<time2<<" "<<n<<endl;
  69. fout<<endl;
  70. }
  71. }
  72. MPI_Finalize();
  73. //fout.close();
  74. }
  75. void mainn(int num , int k)
  76. {
  77. int size = 0;
  78. int rank = 0;
  79. MPI_Comm_size(MPI_COMM_WORLD, &size);
  80. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  81. double *v ;
  82.  
  83. double *w,*s,*b,*c,*a ,*vec;
  84. vec = new double [num];
  85. double *matr;
  86. if(rank==0)
  87. {
  88. //num;количество итераци
  89. v = new double [k*num];
  90. w = new double [num];
  91. s = new double [num];
  92. b = new double [k];
  93. c = new double [num];
  94. a = new double [k];
  95. matr = new double [num*num];
  96. b[0]=0;
  97. vecter(v,num);
  98. multiply(v,1/sqrt(scalarproduct(v,v,num)),v,num);
  99. matrix(matr,num);
  100. }
  101. int loc_rows=num/(size);
  102.  
  103. double *local_mat = new double[loc_rows*num];
  104. double *local_res = new double[loc_rows];
  105. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  106. MPI_Scatter(&matr[0], loc_rows*num, MPI_DOUBLE, &local_mat[0], loc_rows*num, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  107. time2=MPI_Wtime();
  108. for (int i = 0; i < k-1;i++)
  109. {
  110. if(rank==0) {for (int j = 0; j<num;++j)
  111. vec[j] = v[i*num+j];}
  112. MPI_Bcast(&vec[0], num, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  113. for (int l =0; l < loc_rows; ++l) {
  114. local_res[l] = 0;
  115. for (int j = 0; j<num;++j) {
  116. local_res[l] += local_mat[l*num+j] * vec[j];
  117. }
  118. }
  119. MPI_Gather(&local_res[0], loc_rows, MPI_DOUBLE, w, loc_rows, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  120.  
  121. if(rank==0)
  122. {
  123. //multpar(matr,v[i],w,num);
  124. a[i]=scalarproduct(w,&v[i*num],num);
  125. multiply(&v[i*num],a[i],c,num);
  126. sum(w,c,w,'-',num);
  127. if (i!=0)
  128. {
  129. multiply(&v[(i-1)*num],b[i],c,num);
  130. sum(w,c,w,'-',num);
  131. }
  132. ort(w,v,i,num);
  133. ort(w,v,i,num);
  134. b[i+1]=sqrt(scalarproduct(w,w,num));
  135. if (b[i+1]==0)
  136. {
  137. // cout<<"преждевременно"<<i<<endl;
  138. k=i;
  139. break;
  140. }
  141. multiply(w,1/b[i+1],&v[(i+1)*num],num);
  142. }
  143. }
  144. if(rank==0)
  145. {
  146.  
  147. /* for (int i = 0; i< k;i++)
  148. {
  149. for (int j = 0; j < k;j++)
  150. {
  151. float f=scalarproduct(&v[i*num],&v[j*num],num);
  152. if(f<0.001) f=0;
  153. cout<<f<<" ";
  154. }
  155. cout<<endl;
  156. }*/
  157. delete []w;
  158. delete []s ;
  159. delete []b ;
  160. delete []c ;
  161. delete []a;
  162.  
  163. delete []v;
  164. delete []matr;
  165. }
  166. delete []local_res;
  167. delete []local_mat;
  168.  
  169. }
  170. void multpar(double *a, double *v,double *c, int n){
  171. int j;
  172. // omp_set_num_threads(k);
  173. // #pragma omp parallel for private (j)
  174. for (int i = 0; i < n; i++)
  175. {
  176. c[i] = 0;
  177. for ( j = 0; j < n; j++)
  178. {
  179. c[i] +=a[i*n+j]* v[j];
  180. }
  181. }
  182. }
  183.  
  184. void matrix(double *a, int n)
  185. {
  186. srand(time(NULL));
  187. int j;int i;
  188. for ( i = 0; i < n; i++)
  189. for ( j = i; j < n;j++)
  190. {
  191. a[i*n+j]=rand()%10;
  192. a[i+n*j]=a[i*n+j];
  193. }
  194. }
  195. void vecter( double *v,int n)
  196. {
  197. int i;
  198. srand(time(NULL));
  199. for ( i = 0; i < n; i++)
  200. {
  201. v[i]= rand()%10;
  202. }
  203. }
  204. double scalarproduct(double *a,double *b, int n)
  205. {
  206. // omp_set_num_threads(k);
  207. double s=0;int j=0;
  208. // #pragma omp parallel for private (j) reduction(+:s)
  209. for( j=0;j<n; j++)
  210. {
  211. s=s+a[j]*b[j];
  212. }
  213.  
  214. return s;
  215. }
  216.  
  217. void multiply(double *a, double b, double *c, int n)
  218. { // omp_set_num_threads(k);
  219. // #pragma omp parallel for
  220. for( int j=0;j<n; j++)
  221. c[j]=a[j]*b;
  222. }
  223. void sum(double *a, double *b, double *c,char p, int n)
  224. { // omp_set_num_threads(k);
  225. if(p=='-')
  226. // #pragma omp parallel for
  227. for( int j=0;j<n; j++)
  228. c[j]=a[j]-b[j];
  229. else
  230. // #pragma omp parallel for
  231. for( int j=0;j<n; j++)
  232. c[j]=a[j]+b[j];
  233. }
  234. void coutt(double *a, int n)
  235. { for( int i=0;i<n; i++)
  236. //cout<<a[i]<<" ";
  237. //cout<<endl;
  238. ;
  239. }
  240. void ort(double *w,double *v,int k, int num)
  241. {
  242. double s[num];
  243.  
  244. for(int j = 0; j<num;j++)
  245. {
  246. s[j]=0;
  247. }
  248. // omp_set_num_threads(procnum);
  249. // #pragma omp parallel for
  250. for (int j = 0; j<k;j++)
  251. {
  252. double c[num];
  253. multiply(&v[j*num],scalarproduct(w,&v[j*num],num),c,num);
  254. sum(s,c,s,'+',num);
  255. }
  256. sum(w,s,w,'-',num);
  257. }
Advertisement
Add Comment
Please, Sign In to add comment