sagak

openmp

Nov 30th, 2016
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <omp.h>
  5. #include <mpi.h>
  6. #include <math.h>
  7. using namespace std;
  8. void multpar(double **a, double *v,double *c, int n,int k);
  9. void matrix(double **a, int n);
  10. void vecter( double *v,int n);
  11. void coutt(double *a, int n,int k);
  12. double scalarproduct(double *a,double *b, int n,int k);
  13. void multiply(double *a, double b, double *c, int n,int k);
  14. void sum(double *a, double*b, double *c,char p, int n,int k);
  15. void multpar(double **a, double *v,double *c, int n,int k);
  16. void ort(double *w,double **v,int k, int num,int procnum);
  17. void mainn(int num, double *time, int k);
  18. int processor=48;
  19. int main(int argc, char* argv[])
  20. { int k=10,n=1000, l=0;
  21.  
  22.  
  23. double time[7];
  24. ofstream fout("result.txt");
  25. //for(int k=700;k<=700;k=k+100)
  26. for(n=1000;n<=20000;n=n+1000)
  27. {l=0;
  28. mainn(n,time,k );
  29. for(int j=1;j<=64;j=2*j)
  30. fout<<"processor_number="<<j<<" size="<<n<<" time="<<time[l++]<<endl;
  31. fout<<endl;
  32. }
  33. fout.close();
  34. }
  35.  
  36. void mainn(int num, double *time , int k)
  37. {
  38. //num;количество итераци
  39. unsigned int start_time,end_time;
  40. double **v = new double* [k];
  41. double *w = new double [num];
  42. double *s = new double [num];
  43. double *b = new double [k];
  44. double *c = new double [num];
  45. double *a = new double [k];
  46. double **matr = new double* [num];
  47. for (int count = 0; count < k; count++)
  48. v[count] = new double [num];
  49. for (int count = 0; count < num; count++)
  50. {
  51. matr[count] = new double [num];
  52. }
  53. b[0]=0;
  54. vecter(v[0],num);
  55. multiply(v[0],1/sqrt(scalarproduct(v[0],v[0],num,2)),v[0],num,2);
  56. matrix(matr,num);
  57. int l=0;
  58.  
  59. for (int procnum =1; procnum<=64 ;procnum=2*procnum)
  60. { if(procnum==64) procnum=48;
  61. start_time=clock();
  62. for (int i = 0; i < k-1;i++)
  63. {
  64. multpar(matr,v[i],w,num,procnum);
  65. a[i]=scalarproduct(w,v[i],num,procnum);
  66.  
  67.  
  68. multiply(v[i],a[i],c,num,procnum);
  69. sum(w,c,w,'-',num,procnum);
  70. if (i!=0)
  71. {
  72. multiply(v[i-1],b[i],c,num,procnum);
  73. sum(w,c,w,'-',num,procnum);
  74. }
  75.  
  76. ort(w,v,i,num,procnum);
  77. ort(w,v,i,num,procnum);
  78.  
  79. b[i+1]=sqrt(scalarproduct(w,w,num,procnum));
  80. if (b[i+1]==0)
  81. {
  82. // cout<<"преждевременно"<<i<<endl;
  83. k=i;
  84. break;
  85. }
  86. multiply(w,1/b[i+1],v[i+1],num,procnum);
  87. }
  88. end_time=clock();
  89. time[l++]=float(end_time-start_time)/CLOCKS_PER_SEC;
  90. }
  91. /* for (int i = 0; i< k;i++)
  92. {
  93. for (int j = 0; j < k;j++)
  94. {
  95. float f=scalarproduct(v[i],v[j],num,2);
  96. if(f<0.001) f=0;
  97. cout<<f<<" ";
  98. }
  99. cout<<endl;
  100. }*/
  101. delete []w;
  102. delete []s ;
  103. delete []b ;
  104. delete []c ;
  105. delete []a;
  106. for (int count = 0; count < k; count++)
  107. delete[] v[count] ;
  108. for (int count = 0; count < num; count++)
  109. {
  110. delete [] matr[count];
  111. }
  112. delete []v;
  113. delete []matr;
  114.  
  115. }
  116. void multpar(double **a, double *v,double *c, int n,int k){
  117. int j;
  118. omp_set_num_threads(k);
  119. #pragma omp parallel for private (j)
  120. for (int i = 0; i < n; i++)
  121. {
  122. c[i] = 0;
  123. for ( j = 0; j < n; j++)
  124. {
  125. c[i] +=a[i][j]* v[j];
  126. }
  127. }
  128. }
  129.  
  130. void matrix(double **a, int n)
  131. {
  132. srand(time(NULL));
  133. int j;int i;
  134. for ( i = 0; i < n; i++)
  135. for ( j = i; j < n;j++)
  136. {
  137. a[i][j]=rand()%10;
  138. a[j][i]=a[i][j];
  139. }
  140. }
  141. void vecter( double *v,int n)
  142. {
  143. int i;
  144. srand(time(NULL));
  145. for ( i = 0; i < n; i++)
  146. {
  147. v[i]= rand()%10;
  148. }
  149. }
  150. double scalarproduct(double *a,double *b, int n,int k)
  151. {
  152. omp_set_num_threads(k);
  153. double s=0;int j=0;
  154. #pragma omp parallel for private (j) reduction(+:s)
  155. for( j=0;j<n; j++)
  156. {
  157. s=s+a[j]*b[j];
  158. }
  159.  
  160. return s;
  161. }
  162.  
  163. void multiply(double *a, double b, double *c, int n,int k)
  164. { omp_set_num_threads(k);
  165. #pragma omp parallel for
  166. for( int j=0;j<n; j++)
  167. c[j]=a[j]*b;
  168. }
  169. void sum(double *a, double *b, double *c,char p, int n,int k)
  170. { omp_set_num_threads(k);
  171. if(p=='-')
  172. #pragma omp parallel for
  173. for( int j=0;j<n; j++)
  174. c[j]=a[j]-b[j];
  175. else
  176. #pragma omp parallel for
  177. for( int j=0;j<n; j++)
  178. c[j]=a[j]+b[j];
  179. }
  180. void coutt(double *a, int n)
  181. { for( int i=0;i<n; i++)
  182. //cout<<a[i]<<" ";
  183. //cout<<endl;
  184. ;
  185. }
  186.  
  187.  
  188. void ort(double *w,double **v,int k, int num,int procnum)
  189. {
  190. double c[num], s[num];
  191. for(int j = 0; j<num;j++)
  192. {
  193. s[j]=0;
  194. }
  195.  
  196. for (int j = 0; j<k;j++)
  197. {
  198. multiply(v[j],scalarproduct(w,v[j],num,procnum),c,num,procnum);
  199. sum(s,c,s,'+',num,procnum);
  200. }
  201. sum(w,s,w,'-',num,procnum);
  202. }
Advertisement
Add Comment
Please, Sign In to add comment