maygapixel

Untitled

Apr 20th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.43 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 DX[8][8]={0}; //DX = T * X
  96.     float D[8][8]={0};  //D = DX*RT
  97.     int Xsub128[8][8];
  98.     int C[8][8]={0};
  99.  
  100.     int X[8][8] ={{154,123,123,123,123,123,123,136},
  101.             {192,180,136,154,154,154,136,110},
  102.             {254,198,154,154,180,154,123,123},
  103.             {239,180,136,180,180,166,123,123},
  104.             {180,154,136,167,166,149,136,136},
  105.             {128,136,123,136,154,180,198,154},
  106.             {123,105,110,149,136,136,180,166},
  107.             {110,136,123,123,123,136,154,136}};
  108.  
  109.     float T[8][8] ={{0.3536,0.3536,0.3536,0.3536,0.3536,0.3536,0.3536,0.3536},
  110.                    {0.4904,0.4157,0.2778,0.0975,-0.0975,-0.2778,-0.4157,-0.4904},
  111.                    {0.4619,0.1913,-0.1913,-0.4619,-0.4619,-0.1913,0.1913,0.4619},
  112.                    {0.4157,-0.0975,-0.4904,-0.2778,0.2778,0.4904,0.0975,-0.4157},
  113.                    {0.3536,-0.3536,-0.3536,0.3536,0.3536,-0.3536,-0.3536,0.3536},
  114.                    {0.2778,-0.4904,0.0975,0.4157,-0.4157,-0.0975,0.4904,-0.2778},
  115.                    {0.1913,-0.4619,0.4157,-0.1913,-0.1913,0.4157,-0.4619,0.1913},
  116.                    {0.0975,-0.2778,0.4619,-0.4904,0.4904,-0.4619,0.2778,-0.0975}};
  117.  
  118.     float RT[8][8] ={{0.3536,0.4904,0.4619,0.4157,0.3536,0.2778,0.1913,0.0975},
  119.                     {0.3536,0.4157,0.1913,-0.0975,-0.3536,-0.4904,-0.4619,-0.2778},
  120.                     {0.3536,0.2778,-0.1913,-0.4904,-0.3536,0.0975,0.4157,0.4619},
  121.                     {0.3536,0.0975,-0.4619,-0.2778,0.3536,0.4157,-0.1913,-0.4904},
  122.                     {0.3536,-0.0975,-0.4619,0.2778,0.3536,-0.4157,-0.1913,0.4904},
  123.                     {0.3536,-0.2778,-0.1913,0.4904,-0.3536,-0.0975,0.4157,-0.4619},
  124.                     {0.3536,-0.4157,0.1913,0.0975,-0.3536,0.4904,-0.4619,0.2778},
  125.                     {0.3536,-0.4904,0.4619,-0.4157,0.3536,-0.2778,0.1913,-0.0975}};
  126.  
  127.     int Q[8][8] = {{16,11,10,16,24,40,51,61},
  128.                   {12,12,14,19,26,58,60,55},
  129.                   {14,13,16,24,40,57,69,56},
  130.                   {14,17,22,29,51,87,80,62},
  131.                   {18,22,37,56,68,109,103,77},
  132.                   {24,35,55,64,81,104,113,92},
  133.                   {49,64,78,87,103,121,120,101},
  134.                   {72,92,95,98,112,100,103,99}};
  135.  
  136.     switch(rank)
  137.         {
  138.             case 0 : {  EXE_Start_Time = MPI_Wtime();
  139.                         FindXsub(rank,Xsub128,X,&status);
  140.                         FindCX(rank,DX,T,Xsub128,&status);
  141.                         FindY(rank,D,DX,RT,&status);
  142.                         FindYq(rank,C,D,Q,&status);
  143.                         printf("\n\n------------------------------------------------------------------------- \n");
  144.                         printf("X-128 \n");
  145.                         printf("------------------------------------------------------------------------- \n");
  146.                         printValue_Int(Xsub128);
  147.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  148.                      }break;
  149.  
  150.             case 1 : {  EXE_Start_Time = MPI_Wtime();
  151.                         FindXsub(rank,Xsub128,X,&status);
  152.                         FindCX(rank,DX,T,Xsub128,&status);
  153.                         FindY(rank,D,DX,RT,&status);
  154.                         FindYq(rank,C,D,Q,&status);
  155.                         printf("\n\n------------------------------------------------------------------------- \n");
  156.                         printf("DX \n");
  157.                         printf("------------------------------------------------------------------------- \n");
  158.                         printValue_Float(DX);
  159.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  160.                      }break;
  161.  
  162.             case 2 : {  EXE_Start_Time = MPI_Wtime();
  163.                         FindXsub(rank,Xsub128,X,&status);
  164.                         FindCX(rank,DX,T,Xsub128,&status);
  165.                         FindY(rank,D,DX,RT,&status);
  166.                         FindYq(rank,C,D,Q,&status);
  167.                         printf("\n\n------------------------------------------------------------------------- \n");
  168.                         printf("D \n");
  169.                         printf("------------------------------------------------------------------------- \n");
  170.                         printValue_Float(D);
  171.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  172.                      }break;
  173.  
  174.             case 3 : {  EXE_Start_Time = MPI_Wtime();
  175.                         FindXsub(rank,Xsub128,X,&status);
  176.                         FindCX(rank,DX,T,Xsub128,&status);
  177.                         FindY(rank,D,DX,RT,&status);
  178.                         FindYq(rank,C,D,Q,&status);
  179.                         printf("\n\n------------------------------------------------------------------------- \n");
  180.                         printf("C \n");
  181.                         printf("------------------------------------------------------------------------- \n");
  182.                         printValue_Int(C);
  183.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  184.                      }break;
  185.  
  186.             case 4 : {  EXE_Start_Time = MPI_Wtime();
  187.                         FindXsub(rank,Xsub128,X,&status);
  188.                         FindCX(rank,DX,T,Xsub128,&status);
  189.                         FindY(rank,D,DX,RT,&status);
  190.                         FindYq(rank,C,D,Q,&status);
  191.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  192.                      }break;
  193.  
  194.             case 5 : {  EXE_Start_Time = MPI_Wtime();
  195.                         FindXsub(rank,Xsub128,X,&status);
  196.                         FindCX(rank,DX,T,Xsub128,&status);
  197.                         FindY(rank,D,DX,RT,&status);
  198.                         FindYq(rank,C,D,Q,&status);
  199.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  200.                      }break;
  201.  
  202.             case 6 : {  EXE_Start_Time = MPI_Wtime();
  203.                         FindXsub(rank,Xsub128,X,&status);
  204.                         FindCX(rank,DX,T,Xsub128,&status);
  205.                         FindY(rank,D,DX,RT,&status);
  206.                         FindYq(rank,C,D,Q,&status);
  207.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  208.                      }break;
  209.  
  210.             case 7 : {  EXE_Start_Time = MPI_Wtime();
  211.                         FindXsub(rank,Xsub128,X,&status);
  212.                         FindCX(rank,DX,T,Xsub128,&status);
  213.                         FindY(rank,D,DX,RT,&status);
  214.                         FindYq(rank,C,D,Q,&status);
  215.                         printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
  216.                      }break;
  217.         }
  218.  
  219.     MPI_Finalize();
  220.  return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment