maygapixel

Untitled

Apr 19th, 2018
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.30 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <mpi.h>
  3. #include <stdlib.h>
  4.  
  5. void SR_8P_int (int rankk,int i,int data[8][8],int addressStatus){
  6.     int j;
  7.     for(j=0;j<8;j++)
  8.     {
  9.         if(j != rankk)
  10.         {
  11.             MPI_Send( &data[rankk][i], 1, MPI_INT, j, 0, MPI_COMM_WORLD );
  12.             MPI_Recv( &data[j][i], 1, MPI_INT, j, 0, MPI_COMM_WORLD,addressStatus );
  13.         }
  14.     }
  15. }
  16. void SR_8P_float (int rankk,int i,float data[8][8],int addressStatus){
  17.     int j;
  18.     for(j=0;j<8;j++)
  19.     {
  20.         if(j != rankk)
  21.         {
  22.             MPI_Send( &data[rankk][i], 1, MPI_INT, j, 0, MPI_COMM_WORLD );
  23.             MPI_Recv( &data[j][i], 1, MPI_INT, j, 0, MPI_COMM_WORLD,addressStatus );
  24.         }
  25.     }
  26. }
  27.  
  28.  
  29. void FindXsub (int rankk,int dataXsub[8][8],int dataX[8][8],int addressStatus){
  30.     int i;
  31.     for(i=0;i<8;i++){
  32.         dataXsub[rankk][i] = dataX[rankk][i]-128;
  33.         SR_8P_int(rankk,i,dataXsub,addressStatus);
  34.     }
  35. }
  36.  
  37. void FindCX (int rankk,float dataCX[8][8],float dataC[8][8],int dataXsub[8][8],int addressStatus){
  38.     int k,j;
  39.     for(j=0;j<8;j++){
  40.         for(k=0;k<8;k++){
  41.             dataCX[rankk][j] += dataC[rankk][k] * dataXsub[k][j] ;
  42.             //printf("%f+= %f*%d\n",dataCX[rankk][j], dataC[rankk][k], dataXsub[k][j]);
  43.         }
  44.         SR_8P_float(rankk,j,dataCX,addressStatus);
  45.     }
  46. }
  47.  
  48. void FindY (int rankk,float dataY[8][8],float dataCX[8][8],float dataCT[8][8],int addressStatus){
  49.     int i,j;
  50.     for(i=0;i<8;i++){
  51.         for(j=0;j<8;j++){
  52.             dataY[rankk][i]+=dataCX[rankk][j]*dataCT[j][i];
  53.         }
  54.         SR_8P_float(rankk,i,dataY,addressStatus);
  55.     }
  56. }
  57.  
  58. void FindYq(int rankk,int dataYq[8][8],float dataY[8][8],int dataQ[8][8],int addressStatus){
  59.     int i;
  60.     for(i=0;i<8;i++){
  61.         dataYq[rankk][i] = round(dataY[rankk][i]/dataQ[rankk][i]);
  62.         //printf("dataYq[%d][%d] = dataY[%d][%d]/dataQ[%d][%d])==>%d = %f/%d\n",rankk,i,rankk,i,rankk,i,dataYq[rankk][i], dataY[rankk][i], dataQ[rankk][i]);
  63.         SR_8P_int(rankk,i,dataYq,addressStatus);
  64.     }
  65. }
  66. void printValue_Int(int data[8][8]){
  67.     int i,j;
  68.     for(i=0;i<8;i++){
  69.         for(j=0;j<8;j++){
  70.             printf("%d \t",data[i][j]);
  71.         }
  72.         printf("\n");
  73.     }
  74. }
  75. void printValue_Float(float data[8][8]){
  76.     int i,j;
  77.     for(i=0;i<8;i++){
  78.         for(j=0;j<8;j++){
  79.             printf("%.2f \t",data[i][j]);
  80.         }
  81.         printf("\n");
  82.     }
  83. }
  84.  
  85. int main( int argc, char *argv[] )
  86. {
  87.     double EXE_Start_Time;
  88.     int size,rank;
  89.     MPI_Status status;
  90.     MPI_Init( &argc, &argv );
  91.     MPI_Comm_size(MPI_COMM_WORLD,&size);
  92.     MPI_Comm_rank(MPI_COMM_WORLD,&rank);
  93.     int i,value,j,k;
  94.     int tempX[8][8];
  95.     float CX[8][8]={0}; //CX = C * X
  96.     float Y[8][8]={0}; //Y = CX*CT
  97.     int Xsub128[8][8];
  98.     int Yq[8][8]={0};
  99.     int X[8][8] ={{52,55,61,66,70,61,64,73},
  100.             {63,59,55,90,109,85,69,72},
  101.             {62,59,68,113,144,104,66,73},
  102.             {63,58,71,122,154,106,70,69},
  103.             {67,61,68,104,126,88,68,70},
  104.             {79,65,60,70,77,68,58,75},
  105.             {85,71,64,59,55,61,65,83},
  106.             {87,79,69,68,65,76,78,94}};
  107.  
  108.     float C[8][8] ={{0.3536,0.3536,0.3536,0.3536,0.3536,0.3536,0.3536,0.3536},
  109.             {0.4904,0.4157,0.2778,0.0975,-0.0975,-0.2778,-0.4157,-0.4904},
  110.             {0.4619,0.1913,-0.1913,-0.4619,-0.4619,-0.1913,0.1913,0.4619},
  111.             {0.4157,-0.0975,-0.4904,-0.2778,0.2778,0.4904,0.0975,-0.4157},
  112.             {0.3536,-0.3536,-0.3536,0.3536,0.3536,-0.3536,-0.3536,0.3536},
  113.             {0.2778,-0.4904,0.0975,0.4157,-0.4157,-0.0975,0.4904,-0.2778},
  114.             {0.1913,-0.4619,0.4157,-0.1913,-0.1913,0.4157,-0.4619,0.1913},
  115.             {0.0975,-0.2778,0.4619,-0.4904,0.4904,-0.4619,0.2778,-0.0975}};
  116.  
  117.     float CT[8][8] ={{0.3536,0.4904,0.4619,0.4157,0.3536,0.2778,0.1913,0.0975},
  118.                 {0.3536,0.4157,0.1913,-0.0975,-0.3536,-0.4904,-0.4619,-0.2778},
  119.                 {0.3536,0.2778,-0.1913,-0.4904,-0.3536,0.0975,0.4157,0.4619},
  120.                 {0.3536,0.0975,-0.4619,-0.2778,0.3536,0.4157,-0.1913,-0.4904},
  121.                 {0.3536,-0.0975,-0.4619,0.2778,0.3536,-0.4157,-0.1913,0.4904},
  122.                 {0.3536,-0.2778,-0.1913,0.4904,-0.3536,-0.0975,0.4157,-0.4619},
  123.                 {0.3536,-0.4157,0.1913,0.0975,-0.3536,0.4904,-0.4619,0.2778},
  124.                 {0.3536,-0.4904,0.4619,-0.4157,0.3536,-0.2778,0.1913,-0.0975}};
  125.  
  126.     int Q[8][8] = {{16,11,10,16,24,40,51,61},
  127.                 {12,12,14,19,26,58,60,55},
  128.                 {14,13,16,24,40,57,69,56},
  129.                 {14,17,22,29,51,87,80,62},
  130.                 {18,22,37,56,68,109,103,77},
  131.                 {24,35,55,64,81,104,113,92},
  132.                 {49,64,78,87,103,121,120,101},
  133.                 {72,92,95,98,112,100,103,99}};
  134.  
  135.     switch(rank)
  136.         {
  137.             case 0 : {  EXE_Start_Time = MPI_Wtime();
  138.                         FindXsub(rank,Xsub128,X,&status);
  139.                         FindCX(rank,CX,C,Xsub128,&status);
  140.                         FindY(rank,Y,CX,CT,&status);
  141.                         FindYq(rank,Yq,Y,Q,&status);
  142.                         printf("\n\n------------------------------------------------------------------------- \n");
  143.                         printf("X-128 \n");
  144.                         printf("------------------------------------------------------------------------- \n");
  145.                         printValue_Int(Xsub128);
  146.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  147.                      }break;
  148.  
  149.             case 1 : {  EXE_Start_Time = MPI_Wtime();
  150.                         FindXsub(rank,Xsub128,X,&status);
  151.                         FindCX(rank,CX,C,Xsub128,&status);
  152.                         FindY(rank,Y,CX,CT,&status);
  153.                         FindYq(rank,Yq,Y,Q,&status);
  154.                         printf("\n\n------------------------------------------------------------------------- \n");
  155.                         printf("CX \n");
  156.                         printf("------------------------------------------------------------------------- \n");
  157.                         printValue_Float(CX);
  158.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  159.                      }break;
  160.  
  161.             case 2 : {  EXE_Start_Time = MPI_Wtime();
  162.                         FindXsub(rank,Xsub128,X,&status);
  163.                         FindCX(rank,CX,C,Xsub128,&status);
  164.                         FindY(rank,Y,CX,CT,&status);
  165.                         FindYq(rank,Yq,Y,Q,&status);
  166.                         printf("\n\n------------------------------------------------------------------------- \n");
  167.                         printf("Y \n");
  168.                         printf("------------------------------------------------------------------------- \n");
  169.                         printValue_Float(CX);
  170.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  171.                      }break;
  172.  
  173.             case 3 : {  EXE_Start_Time = MPI_Wtime();
  174.                         FindXsub(rank,Xsub128,X,&status);
  175.                         FindCX(rank,CX,C,Xsub128,&status);
  176.                         FindY(rank,Y,CX,CT,&status);
  177.                         FindYq(rank,Yq,Y,Q,&status);
  178.                         printf("\n\n------------------------------------------------------------------------- \n");
  179.                         printf("Yq \n");
  180.                         printf("------------------------------------------------------------------------- \n");
  181.                         printValue_Int(Yq);
  182.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  183.                      }break;
  184.  
  185.             case 4 : {  EXE_Start_Time = MPI_Wtime();
  186.                         FindXsub(rank,Xsub128,X,&status);
  187.                         FindCX(rank,CX,C,Xsub128,&status);
  188.                         FindY(rank,Y,CX,CT,&status);
  189.                         FindYq(rank,Yq,Y,Q,&status);
  190.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  191.                      }break;
  192.  
  193.             case 5 : {  EXE_Start_Time = MPI_Wtime();
  194.                         FindXsub(rank,Xsub128,X,&status);
  195.                         FindCX(rank,CX,C,Xsub128,&status);
  196.                         FindY(rank,Y,CX,CT,&status);
  197.                         FindYq(rank,Yq,Y,Q,&status);
  198.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  199.                      }break;
  200.  
  201.             case 6 : {  EXE_Start_Time = MPI_Wtime();
  202.                         FindXsub(rank,Xsub128,X,&status);
  203.                         FindCX(rank,CX,C,Xsub128,&status);
  204.                         FindY(rank,Y,CX,CT,&status);
  205.                         FindYq(rank,Yq,Y,Q,&status);
  206.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  207.                      }break;
  208.  
  209.             case 7 : {  EXE_Start_Time = MPI_Wtime();
  210.                         FindXsub(rank,Xsub128,X,&status);
  211.                         FindCX(rank,CX,C,Xsub128,&status);
  212.                         FindY(rank,Y,CX,CT,&status);
  213.                         FindYq(rank,Yq,Y,Q,&status);
  214.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  215.                      }break;
  216.         }
  217.  
  218.     MPI_Finalize();
  219.  return 0;
  220. }
Add Comment
Please, Sign In to add comment