KvanTTT

Untitled

Dec 22nd, 2012
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.41 KB | None | 0 0
  1. #include<mpi.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include <pcontrol.h>
  5.  
  6. #define an 2000
  7. #define am 1500
  8. #define bm 1200
  9.  
  10. int main (int argc,char **argv)
  11. {
  12.    double time,time_seq, time_par;
  13.    int rank, size;
  14.  
  15.    char *tracefile;
  16.  
  17.    MPI_Init(&argc,&argv);
  18.    
  19.    tracefile = getenv("TVTRACE");
  20.    if( tracefile != NULL ){
  21.       printf( "tv tracefile=%s\n", tracefile );
  22.       MPI_Pcontrol(TRACEFILES, NULL, tracefile, 0);      
  23.    }
  24.    else{
  25.       MPI_Pcontrol(TRACEFILES, NULL, "trace", 0);
  26.    }
  27.    MPI_Pcontrol(TRACELEVEL, 1, 1, 1);
  28.    MPI_Pcontrol(TRACENODE, 1000000, 1, 1);
  29.  
  30.  
  31.    MPI_Comm_rank (MPI_COMM_WORLD,&rank);
  32.    MPI_Comm_size (MPI_COMM_WORLD,&size);
  33.  
  34.  
  35.    if( !rank ){
  36.       double *a,*b,*c, *c0;
  37.       int i,i1,j,k;
  38.       int ann;
  39.       MPI_Status *st;
  40.       MPI_Request *rq,rq1;
  41.       rq = (MPI_Request*) malloc( (size-1)*sizeof(MPI_Request) );
  42.       st = (MPI_Status*) malloc( (size-1)*sizeof(MPI_Status) );
  43.  
  44.  
  45.       ann=an/size+((an%size)?1:0);
  46. //      printf("[%d]ann=%d\n", rank, ann );
  47.  
  48.       a=(double*) malloc(am*an*sizeof(double));
  49.       b=(double*) malloc(am*bm*sizeof(double));
  50.       c=(double*) malloc(an*bm*sizeof(double));
  51.       for(i=0;i<am*an;i++)
  52.         a[i]=rand()%301;
  53.       for(i=0;i<am*bm;i++)
  54.         b[i]=rand()%251;
  55.       printf( "Data ready [%d]\n", rank );
  56.      
  57.       c0 = (double*)malloc(an*bm*sizeof(double));
  58.  
  59.      
  60.       time = MPI_Wtime();  
  61.       for (i=0; i<an; i++)
  62.          for (j=0; j<bm; j++)
  63.          {
  64.             double s = 0.0;
  65.             for (k=0; k<am; k++)
  66.               s+= a[i*am+k]*b[k*bm+j];
  67.             c0[i*bm+j] = s;
  68.       }
  69.       time = MPI_Wtime() - time;
  70.       printf("Time seq[%d] = %lf\n", rank, time );
  71.       time_seq = time;
  72.  
  73.       MPI_Barrier( MPI_COMM_WORLD );
  74.       time=MPI_Wtime();
  75.  
  76.       MPI_Bcast( b, am*bm, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  77.       printf( "Data Bcast [%d]\n", rank );
  78.  
  79.       for( i1=0, j=1; j<size; j++, i1+=ann*am ){
  80.          printf( "Data to Send [%d] %016x[%4d] =>> %d\n", rank, a+i1, i1, j );
  81.          MPI_Isend( a+i1, ann*am, MPI_DOUBLE, j, 101, MPI_COMM_WORLD, &rq1 );
  82.          MPI_Request_free( &rq1 );
  83.          printf( "Data Send [%d] =>> %d\n", rank, j );
  84.       }
  85.       printf( "Data Send [%d]\n", rank );
  86.      
  87.       MPI_Isend( a+i1, 1, MPI_DOUBLE, 0, 101, MPI_COMM_WORLD, &rq1 );
  88.       MPI_Request_free( &rq1 );
  89.      
  90.       printf( "Data Send [%d] =>> %d\n", rank, j );
  91.  
  92.  
  93.       for(i=(i1/am);i<an;i++)
  94.         for(j=0;j<bm;j++){
  95.           double s=0.0;
  96.           for(k=0;k<am;k++)
  97.              s+=a[i*am+k]*b[k*bm+j];
  98.           c[i*bm+j]=s;
  99.         }
  100.  
  101.       printf( "Job done  [%d]\n", rank );
  102.       for( i1=0, j=1; j<size; j++, i1+=(ann*bm) ){
  103.          printf( "Data to Recv [%d] %016x[%4d] =>> %d\n", rank, c+i1, i1/bm, j );
  104.          MPI_Irecv( c+i1, ann*am, MPI_DOUBLE, j, 102, MPI_COMM_WORLD, rq+(j-1) );
  105.       }        
  106.       MPI_Waitall( size-1, rq, st );
  107.      
  108.       time=MPI_Wtime()-time;
  109.       printf("time [%d]=%12.8lf\n",rank,time);
  110.       time_par = time;
  111.  
  112.       printf( "Data collected [%d]\n", rank );
  113.      
  114.       time=MPI_Wtime();
  115.       int ok = 1;
  116.       for(i=0;i<an*bm;i++)
  117.         if( c[i] != c0[i] ){
  118.            ok = 0;
  119.            printf( "Fail [%d %d] %lf != %lf\n", i/bm, i%bm, c[i], c0[i] );
  120.            break;
  121.         }
  122.       time=MPI_Wtime()-time;
  123.       if( ok ){
  124.         printf( "Data verifeid [%d] time = %lf\n", rank, time );
  125.         printf( "SpeedUp S(%d) = %14.10lf\n", size, time_seq/time_par );
  126.         printf( "Efitncy E(%d) = %14.10lf\n", size, time_seq/(time_par*size) );
  127.       }
  128.        
  129.    }
  130.    else
  131.    {
  132.       int ann;
  133.       double *a,*b,*c;
  134.       MPI_Status st;
  135.       int i,j,k;
  136.  
  137.       MPI_Pcontrol(TRACEEVENT, "entry", 0, 0, "");
  138.  
  139.       ann= an/size + ((an%size)?1:0);
  140. //      if(rank==1)
  141. //        printf("[%d]ann=%d = %d / %d \n", rank, ann, an, size );
  142.        
  143.       a=(double*)malloc(ann*am*sizeof(double));
  144.       b=(double*)malloc(bm*am*sizeof(double));
  145.       c=(double*)malloc(ann*bm*sizeof(double));
  146.       printf( "Mem allocated [%d]\n", rank );
  147.  
  148.      
  149.       MPI_Barrier( MPI_COMM_WORLD );
  150.       MPI_Pcontrol(TRACEEVENT, "exit", 0, 0, "");
  151.       time = MPI_Wtime();
  152.  
  153.  
  154.       MPI_Pcontrol(TRACEEVENT, "entry", 1, 0, "");
  155.      
  156.       MPI_Bcast(b,am*bm,MPI_DOUBLE,0,MPI_COMM_WORLD);
  157.       printf( "Data Bcast [%d]\n", rank );
  158.      
  159.       MPI_Recv( a, ann*am, MPI_DOUBLE, 0, 101, MPI_COMM_WORLD, &st);
  160.       printf( "Data Recv [%d]\n", rank );
  161.      
  162.       MPI_Pcontrol(TRACEEVENT, "exit", 1, 0, "");
  163.                                    
  164.       MPI_Pcontrol(TRACEEVENT, "entry", 2, 0, "");
  165.       for( i=0; i<ann; i++ )
  166.         for(j=0;j<bm;j++){
  167.             double s=0.0;
  168.            
  169.             for( k=0; k<am; k++ ){
  170.                s+=a[i*am+k]*b[k*bm+j];
  171.             }
  172. /*    
  173.             if(1==rank){
  174.                if(0==j){
  175.                   printf( "c[%d<%d %d] = %lf\n", i,ann,j, s );
  176.                }
  177.             }
  178. */
  179.             c[i*bm+j]=s;
  180.         }
  181.       printf( "Job done  [%d]\n", rank );
  182.       MPI_Pcontrol(TRACEEVENT, "exit", 2, 0, "");
  183.  
  184.       MPI_Pcontrol(TRACEEVENT, "entry", 3, 0, "");
  185.       MPI_Send( c, ann*bm,  MPI_DOUBLE, 0, 102, MPI_COMM_WORLD);
  186.       printf( "Data returned [%d]\n", rank );
  187.       MPI_Pcontrol(TRACEEVENT, "exit", 3, 0, "");
  188.  
  189.       time=MPI_Wtime()-time;
  190.       printf("time [%d]=%12.8lf\n",rank,time);
  191.    }
  192.    
  193.    MPI_Finalize();
  194.    return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment