power.c
上传用户:hhyinxing
上传日期:2013-09-10
资源大小:833k
文件大小:4k
源码类别:

并行计算

开发平台:

Unix_Linux

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "mpi.h"
  4. #include "math.h"
  5. #define E 0.0001
  6. #define a(x,y) a[x*size+y]
  7. #define b(x) b[x]
  8. #define v(x) v[x]
  9. #define A(x,y) A[x*size+y]
  10. #define V(x) V[x]
  11. #define intsize sizeof(int)
  12. #define floatsize sizeof(float)
  13. #define charsize sizeof(char)
  14. int size,N;
  15. int m;
  16. float *A;
  17. float *V;                                         /* store the value x */
  18. double starttime;
  19. double time1;
  20. double time2;
  21. int my_rank;
  22. int p;
  23. MPI_Status status;
  24. FILE *fdA,*fdB;
  25. void Environment_Finalize(float *a,float *b,float *v)
  26. {
  27.     free(a);
  28.     free(b);
  29.     free(v);
  30. }
  31. int main(int argc, char **argv)
  32. {
  33.     int i,j,my_rank,group_size;
  34.     float sum;
  35.     float *b;
  36.     float *v;
  37.     float *a;
  38.     float differ,max,localmax,oldmax;
  39.     int loop;
  40.     loop=0;
  41.     differ=1.0;
  42.     oldmax=0.0;
  43.     MPI_Init(&argc,&argv);
  44.     MPI_Comm_size(MPI_COMM_WORLD,&group_size);
  45.     MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
  46.     p=group_size;
  47.     if(my_rank==0)
  48.     {
  49.         starttime=MPI_Wtime();
  50.         fdA=fopen("dataIn.txt","r");
  51.         fscanf(fdA,"%d %d", &size, &N);
  52.         if (size != N-1)
  53.         {
  54.             printf("the input is wrongn");
  55.             exit(1);
  56.         }
  57.         A=(float *)malloc(floatsize*size*size);
  58.         V=(float *)malloc(floatsize*size);
  59.         for(i = 0; i < size; i++)
  60.         {
  61.             for(j = 0; j < size; j++)
  62.             {
  63.                 fscanf(fdA,"%f", A+i*size+j);
  64.             }
  65.             fscanf(fdA,"%f", V+i);
  66.         }
  67.         fclose(fdA);
  68.         printf("Input of file "dataIn.txt"n");
  69.         printf("%dt%dn", size, N);
  70.         for(i = 0; i < size; i ++)
  71.         {
  72.             for(j = 0; j < size; j ++) printf("%ft",A(i,j));
  73.             printf("%fn",V(i));
  74.         }
  75.         printf("n");
  76.         printf("Output of runningn");
  77.     }
  78.     MPI_Bcast(&size,1,MPI_INT,0,MPI_COMM_WORLD);
  79.     m=size/p;if (size%p!=0) m++;
  80.     v=(float *)malloc(floatsize*size);
  81.     a=(float *)malloc(floatsize*m*size);
  82.     b=(float *)malloc(floatsize*m);
  83.     if (a==NULL||b==NULL||v==NULL)
  84.         printf("allocate space  fail!");
  85.     if (my_rank==0)
  86.     {
  87.         for(i=0;i<size;i++)
  88.             v(i)=V(i);
  89.     }
  90.     MPI_Bcast(v,size,MPI_FLOAT,0,MPI_COMM_WORLD);
  91.     if (my_rank==0)
  92.     {
  93.         for(i=0;i<m;i++)
  94.             for(j=0;j<size;j++)
  95.                 a(i,j)=A(i,j);
  96.     }
  97.     if (my_rank==0)
  98.     {
  99.         for(i=1;i<p;i++)
  100.             MPI_Send(&(A(m*i,0)),m*size,MPI_FLOAT,i,i,MPI_COMM_WORLD);
  101.         free(A);free(V);
  102.     }
  103.     else
  104.         MPI_Recv(a,m*size,MPI_FLOAT,0,my_rank,MPI_COMM_WORLD,&status);
  105.     time1=MPI_Wtime();
  106.     while (differ>E)                              /* computing start */
  107.     {
  108.         for(i=0;i<m;i++)
  109.         {
  110.             sum=0.0;
  111.             for(j=0;j<size;j++)
  112.                 sum=sum+a(i,j)*v(j);
  113.             b(i)=sum;
  114.         }
  115.         localmax=fabs(b(0));
  116.         for(i=1;i<m;i++)
  117.             if (fabs(b(i))>localmax)
  118.                 localmax=fabs(b(i));
  119.         MPI_Allreduce(&localmax,&max,1,MPI_FLOAT,MPI_MAX,MPI_COMM_WORLD);
  120.         for(i=0;i<m;i++)
  121.             b(i)=b(i)/max;
  122.         MPI_Allgather(b,m,MPI_FLOAT,v,m,MPI_FLOAT,MPI_COMM_WORLD);
  123.         differ=fabs(max-oldmax);
  124.         oldmax=max;
  125.         loop++;
  126.         if (my_rank==0)
  127.             printf("%2d th  differ=%fn",loop,differ);
  128.     }                                             /* while */
  129.     time2=MPI_Wtime();
  130.     if (my_rank==0)
  131.     {
  132.         printf("the envalue is %fnn",max);
  133.         printf("Iteration num = %dn",loop);
  134.         printf("Whole running time    = %f sn",time2-starttime);
  135.         printf("Distribute data time  = %f sn",time1-starttime);
  136.         printf("Parallel compute time = %f sn",time2-time1);
  137.     }
  138.     MPI_Barrier(MPI_COMM_WORLD);
  139.     MPI_Finalize();
  140.     Environment_Finalize(a,b,v);
  141.     return (0);
  142. }