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

并行计算

开发平台:

Unix_Linux

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "mpi.h"
  4. #include "math.h"
  5. #include "string.h"
  6. #define E 0.0001
  7. #define intsize sizeof(int)
  8. #define floatsize sizeof(float)
  9. #define A(x,y) A[x*col+y]                         /* A is matrix row*col */
  10. #define I(x,y) I[x*col+y]                         /* I is matrix col*col */
  11. #define U(x,y) U[x*col+y]
  12. #define B(x)   B[x]
  13. #define a(x,y) a[x*col+y]
  14. #define e(x,y) e[x*col+y]
  15. int col,row;
  16. int m,n,p;
  17. int myid,group_size;
  18. float *A,*I,*B,*U;
  19. float *a,*e;
  20. MPI_Status status;
  21. float starttime,endtime,time1,time2;
  22. void read_fileA()
  23. {
  24.     int i,j;
  25.     FILE *fdA;
  26.     time1=MPI_Wtime();
  27.     fdA=fopen("dataIn.txt","r");
  28.     fscanf(fdA,"%d %d", &row, &col);
  29.     A=(float*)malloc(floatsize*row*col);
  30.     for(i = 0; i < row; i ++)
  31.     {
  32.         for(j = 0; j < col; j ++) fscanf(fdA, "%f", A+i*row+j);
  33.     }
  34.     fclose(fdA);
  35.     printf("Input of file "dataIn.txt"n");
  36.     printf("%dt %dn",row, col);
  37.     for(i=0;i<row;i++)
  38.     {
  39.         for(j=0;j<col;j++) printf("%ft",A(i,j));
  40.         printf("n");
  41.     }
  42.     I=(float*)malloc(floatsize*col*col);
  43.     for(i=0;i<col;i++)
  44.         for(j=0;j<col;j++)
  45.             if (i==j) I(i,j)=1.0;
  46.     else I(i,j)=0.0;
  47. }
  48. int main(int argc,char **argv)
  49. {
  50.     int loop;
  51.     int i,j,v;
  52.     int p,group_size,myid;
  53.     int k;
  54.     float *sum, *ss;
  55.     float aa,bb,rr,c,s,t;
  56.     float su;
  57.     float *temp,*temp1;
  58.     MPI_Init(&argc,&argv);
  59.     MPI_Comm_size(MPI_COMM_WORLD,&group_size);
  60.     MPI_Comm_rank(MPI_COMM_WORLD,&myid);
  61.     if (myid==0) starttime=MPI_Wtime();
  62.     p=group_size;
  63.     loop=0;
  64.     k=0;
  65.     if (myid==0)
  66.         read_fileA();
  67.     MPI_Bcast(&row,1,MPI_INT,0,MPI_COMM_WORLD);
  68.     MPI_Bcast(&col,1,MPI_INT,0,MPI_COMM_WORLD);
  69.     m=row/p; if (row%p!=0) m++;                   /*    for a    */
  70.     n=col/p; if (col%p!=0) n++;                   /*    for e    */
  71.     if (myid==0)
  72.     {
  73.         B=(float*)malloc(floatsize*col);
  74.         U=(float*)malloc(floatsize*row*col);
  75.     }
  76.     a=(float*)malloc(floatsize*m*col);
  77.     e=(float*)malloc(floatsize*n*col);
  78.     temp=(float*)malloc(floatsize*m);
  79.     temp1=(float*)malloc(floatsize*n);
  80.     ss=(float*)malloc(floatsize*3);
  81.     sum=(float*)malloc(floatsize*3);
  82.     if (myid==0)
  83.     {
  84.         for(i=0;i<m;i++)
  85.             for(j=0;j<col;j++)
  86.                 a(i,j)=A(i,j);
  87.         for(i=0;i<n;i++)
  88.             for(j=0;j<col;j++)
  89.                 e(i,j)=I(i,j);
  90.         for(i=1;i<p;i++)
  91.         {
  92.             MPI_Send(&(A(m*i,0)),m*col,MPI_FLOAT,i,i,MPI_COMM_WORLD);
  93.             MPI_Send(&(I(n*i,0)),n*col,MPI_FLOAT,i,i,MPI_COMM_WORLD);
  94.         }
  95.     }
  96.     else
  97.     {
  98.         MPI_Recv(a,m*col,MPI_FLOAT,0,myid,MPI_COMM_WORLD,&status);
  99.         MPI_Recv(e,n*col,MPI_FLOAT,0,myid,MPI_COMM_WORLD,&status);
  100.     }
  101.     if (myid==0)                                  /* start computing now */
  102.         time2=MPI_Wtime();
  103.     while (k<=col*(col-1)/2)
  104.     {
  105.         for(i=0;i<col;i++)
  106.             for(j=i+1;j<col;j++)
  107.         {
  108.             ss[0]=0; ss[1]=0; ss[2]=0;
  109.             sum[0]=0; sum[1]=0; sum[2]=0;
  110.             for(v=0;v<m;v++)
  111.                 ss[0]=ss[0]+a(v,i)*a(v,j);
  112.             for(v=0;v<m;v++)
  113.                 ss[1]=ss[1]+a(v,i)*a(v,i);
  114.             for(v=0;v<m;v++)
  115.                 ss[2]=ss[2]+a(v,j)*a(v,j);
  116.             MPI_Allreduce(ss,sum,3,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
  117.             if (fabs(sum[0])>E)
  118.             {
  119.                 aa=2*sum[0];
  120.                 bb=sum[1]-sum[2];
  121.                 rr=sqrt(aa*aa+bb*bb);
  122.                 if (bb>=0)
  123.                 {
  124.                     c=sqrt((bb+rr)/(2*rr));
  125.                     s=aa/(2*rr*c);
  126.                 }
  127.                 if (bb<0)
  128.                 {
  129.                     s=sqrt((rr-bb)/(2*rr));
  130.                     c=aa/(2*rr*s);
  131.                 }
  132.                 for(v=0;v<m;v++)
  133.                 {
  134.                     temp[v]=c*a(v,i)+s*a(v,j);
  135.                     a(v,j)=(-s)*a(v,i)+c*a(v,j);
  136.                 }
  137.                 for(v=0;v<m;v++)
  138.                     a(v,i)=temp[v];
  139.                 for(v=0;v<n;v++)
  140.                 {
  141.                     temp1[v]=c*e(v,i)+s*e(v,j);
  142.                     e(v,j)=(-s)*e(v,i)+c*e(v,j);
  143.                 }
  144.                 for(v=0;v<n;v++)
  145.                     e(v,i)=temp1[v];
  146.             }
  147.             else
  148.                 k++;
  149.         }                                         /* for */
  150.         loop ++;
  151.     }                                             /* while */
  152.     if (myid==0)
  153.     {
  154.         for(i=0;i<m;i++)
  155.             for(j=0;j<col;j++)
  156.                 A(i,j)=a(i,j);
  157.         for(i=0;i<n;i++)
  158.             for(j=0;j<col;j++)
  159.                 I(i,j)=e(i,j);
  160.     }
  161.     if (myid!=0)
  162.         MPI_Send(a,m*col,MPI_FLOAT,0,myid,MPI_COMM_WORLD);
  163.     else
  164.     {
  165.         for(j=1;j<p;j++)
  166.         {
  167.             MPI_Recv(a,m*col,MPI_FLOAT,j,j,MPI_COMM_WORLD,&status);
  168.             for(i=0;i<m;i++)
  169.                 for(k=0;k<col;k++)
  170.                     A((j*m+i),k)=a(i,k);
  171.         }
  172.     }
  173.     if (myid!=0)
  174.         MPI_Send(e,n*col,MPI_FLOAT,0,myid,MPI_COMM_WORLD);
  175.     else
  176.     {
  177.         for(j=1;j<p;j++)
  178.         {
  179.             MPI_Recv(e,n*col,MPI_FLOAT,j,j,MPI_COMM_WORLD,&status);
  180.             for(i=0;i<n;i++)
  181.                 for(k=0;k<col;k++)
  182.                     I((j*n+i),k)=e(i,k);
  183.         }
  184.     }
  185.     if (myid==0)
  186.     {
  187.         for(j=0;j<col;j++)
  188.         {
  189.             su=0.0;
  190.             for(i=0;i<row;i++)
  191.                 su=su+A(i,j)*A(i,j);
  192.             B(j)=sqrt(su);
  193.         }
  194.         for(i=1;i<col;i++)
  195.             for(j=0;j<i;j++)
  196.         {
  197.             t=I(i,j);
  198.             I(i,j)=I(j,i);
  199.             I(j,i)=t;
  200.         }
  201.         for(j=0;j<col;j++)
  202.             for(i=0;i<row;i++)
  203.                 U(i,j )=A(i,j )/B(j);
  204.         printf(".........U.........n");
  205.         for(i=0;i<row;i++)
  206.         {
  207.             for(j=0;j<col;j++)
  208.                 printf("%ft",U(i,j));
  209.             printf("n");
  210.         }
  211.         printf("........E.........n");
  212.         for(i=0;i<col;i++)
  213.             printf("%ft",B(i));
  214.         printf("n");
  215.         printf("........Vt........n");
  216.         for(i=0;i<col;i++)
  217.         {
  218.             for(j=0;j<col;j++)
  219.                 printf("%ft",I(i,j));
  220.             printf("n");
  221.         }
  222.     }
  223.     if (myid==0)
  224.     {
  225.         endtime=MPI_Wtime();
  226.         printf("n");
  227.         printf("Iteration num = %dn",loop);
  228.         printf("Whole running time    = %f secondsn",endtime-starttime);
  229.         printf("Distribute data time  = %f secondsn",time2-time1);
  230.         printf("Parallel compute time = %f secondsn",endtime-time2);
  231.     }
  232.     MPI_Finalize();
  233.     free(a);
  234.     free(e);
  235.     free(A);
  236.     free(U);
  237.     free(I);
  238.     free(B);
  239.     free(temp);
  240.     free(temp1);
  241.     return(0);
  242. }