Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <fstream>
- #include <cstdlib>
- #include <ctime>
- #include <mpi.h>
- #include <math.h>
- #include <iostream>
- using namespace std;
- float time2;
- void matvec(double *mat, double *vec, int N, int loc_rows, double *res);
- void multpar(double *a, double *v,double *c, int n);
- void matrix(double *a, int n);
- void vecter( double *v,int n);
- void coutt(double *a, int n);
- double scalarproduct(double *a,double *b, int n);
- void multiply(double *a, double b, double *c, int n);
- void sum(double *a, double*b, double *c,char p, int n);
- void ort(double *w,double *v,int k, int num);
- void mainn(int num, int k);
- int processor=4;
- int main(int argc, char* argv[])
- {
- int k=500,n=100, l=0;
- MPI_Init(&argc, &argv);
- ofstream fout("result256.txt",ios::app );
- //for(int k=700;k<=700;k=k+100)
- int size, rank;
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- double f;
- for(n=1000;n<=15000;n=n+1000)
- {
- float start_time,end_time;
- start_time=MPI_Wtime();
- mainn(n,k);
- int rank,size ;
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- end_time=MPI_Wtime();
- float time=float(end_time-start_time);
- time2=float(end_time-time2);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- if(rank==0)
- {
- fout<<size<<" "<<time<<" "<<time2<<" "<<n<<endl;
- fout<<endl;
- }
- }
- for(n=17000;n<=25000;n=n+4000)
- {
- l=0;
- float start_time,end_time;
- start_time=MPI_Wtime();
- mainn(n,k);
- int rank,size ;
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- end_time=MPI_Wtime();
- float time=float(end_time-start_time);
- time2=float(end_time-time2);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- if(rank==0)
- {
- fout<<size<<" "<<time<<" "<<time2<<" "<<n<<endl;
- fout<<endl;
- }
- }
- MPI_Finalize();
- //fout.close();
- }
- void mainn(int num , int k)
- {
- int size = 0;
- int rank = 0;
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- double *v ;
- double *w,*s,*b,*c,*a ,*vec;
- vec = new double [num];
- double *matr;
- if(rank==0)
- {
- //num;количество итераци
- v = new double [k*num];
- w = new double [num];
- s = new double [num];
- b = new double [k];
- c = new double [num];
- a = new double [k];
- matr = new double [num*num];
- b[0]=0;
- vecter(v,num);
- multiply(v,1/sqrt(scalarproduct(v,v,num)),v,num);
- matrix(matr,num);
- }
- int loc_rows=num/(size);
- double *local_mat = new double[loc_rows*num];
- double *local_res = new double[loc_rows];
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Scatter(&matr[0], loc_rows*num, MPI_DOUBLE, &local_mat[0], loc_rows*num, MPI_DOUBLE, 0, MPI_COMM_WORLD);
- time2=MPI_Wtime();
- for (int i = 0; i < k-1;i++)
- {
- if(rank==0) {for (int j = 0; j<num;++j)
- vec[j] = v[i*num+j];}
- MPI_Bcast(&vec[0], num, MPI_DOUBLE, 0, MPI_COMM_WORLD);
- for (int l =0; l < loc_rows; ++l) {
- local_res[l] = 0;
- for (int j = 0; j<num;++j) {
- local_res[l] += local_mat[l*num+j] * vec[j];
- }
- }
- MPI_Gather(&local_res[0], loc_rows, MPI_DOUBLE, w, loc_rows, MPI_DOUBLE, 0, MPI_COMM_WORLD);
- if(rank==0)
- {
- //multpar(matr,v[i],w,num);
- a[i]=scalarproduct(w,&v[i*num],num);
- multiply(&v[i*num],a[i],c,num);
- sum(w,c,w,'-',num);
- if (i!=0)
- {
- multiply(&v[(i-1)*num],b[i],c,num);
- sum(w,c,w,'-',num);
- }
- ort(w,v,i,num);
- ort(w,v,i,num);
- b[i+1]=sqrt(scalarproduct(w,w,num));
- if (b[i+1]==0)
- {
- // cout<<"преждевременно"<<i<<endl;
- k=i;
- break;
- }
- multiply(w,1/b[i+1],&v[(i+1)*num],num);
- }
- }
- if(rank==0)
- {
- /* for (int i = 0; i< k;i++)
- {
- for (int j = 0; j < k;j++)
- {
- float f=scalarproduct(&v[i*num],&v[j*num],num);
- if(f<0.001) f=0;
- cout<<f<<" ";
- }
- cout<<endl;
- }*/
- delete []w;
- delete []s ;
- delete []b ;
- delete []c ;
- delete []a;
- delete []v;
- delete []matr;
- }
- delete []local_res;
- delete []local_mat;
- }
- void multpar(double *a, double *v,double *c, int n){
- int j;
- // omp_set_num_threads(k);
- // #pragma omp parallel for private (j)
- for (int i = 0; i < n; i++)
- {
- c[i] = 0;
- for ( j = 0; j < n; j++)
- {
- c[i] +=a[i*n+j]* v[j];
- }
- }
- }
- void matrix(double *a, int n)
- {
- srand(time(NULL));
- int j;int i;
- for ( i = 0; i < n; i++)
- for ( j = i; j < n;j++)
- {
- a[i*n+j]=rand()%10;
- a[i+n*j]=a[i*n+j];
- }
- }
- void vecter( double *v,int n)
- {
- int i;
- srand(time(NULL));
- for ( i = 0; i < n; i++)
- {
- v[i]= rand()%10;
- }
- }
- double scalarproduct(double *a,double *b, int n)
- {
- // omp_set_num_threads(k);
- double s=0;int j=0;
- // #pragma omp parallel for private (j) reduction(+:s)
- for( j=0;j<n; j++)
- {
- s=s+a[j]*b[j];
- }
- return s;
- }
- void multiply(double *a, double b, double *c, int n)
- { // omp_set_num_threads(k);
- // #pragma omp parallel for
- for( int j=0;j<n; j++)
- c[j]=a[j]*b;
- }
- void sum(double *a, double *b, double *c,char p, int n)
- { // omp_set_num_threads(k);
- if(p=='-')
- // #pragma omp parallel for
- for( int j=0;j<n; j++)
- c[j]=a[j]-b[j];
- else
- // #pragma omp parallel for
- for( int j=0;j<n; j++)
- c[j]=a[j]+b[j];
- }
- void coutt(double *a, int n)
- { for( int i=0;i<n; i++)
- //cout<<a[i]<<" ";
- //cout<<endl;
- ;
- }
- void ort(double *w,double *v,int k, int num)
- {
- double s[num];
- for(int j = 0; j<num;j++)
- {
- s[j]=0;
- }
- // omp_set_num_threads(procnum);
- // #pragma omp parallel for
- for (int j = 0; j<k;j++)
- {
- double c[num];
- multiply(&v[j*num],scalarproduct(w,&v[j*num],num),c,num);
- sum(s,c,s,'+',num);
- }
- sum(w,s,w,'-',num);
- }
Advertisement
Add Comment
Please, Sign In to add comment