Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <mpi.h>
- #include <stdlib.h>
- void SR_8P_int (int rankk,int i,int data[8][8],int addressStatus){
- int j;
- for(j=0;j<8;j++)
- {
- if(j != rankk)
- {
- MPI_Send( &data[rankk][i], 1, MPI_INT, j, 0, MPI_COMM_WORLD );
- MPI_Recv( &data[j][i], 1, MPI_INT, j, 0, MPI_COMM_WORLD,addressStatus );
- }
- }
- }
- void SR_8P_float (int rankk,int i,float data[8][8],int addressStatus){
- int j;
- for(j=0;j<8;j++)
- {
- if(j != rankk)
- {
- MPI_Send( &data[rankk][i], 1, MPI_INT, j, 0, MPI_COMM_WORLD );
- MPI_Recv( &data[j][i], 1, MPI_INT, j, 0, MPI_COMM_WORLD,addressStatus );
- }
- }
- }
- void FindXsub (int rankk,int dataXsub[8][8],int dataX[8][8],int addressStatus){
- int i;
- for(i=0;i<8;i++){
- dataXsub[rankk][i] = dataX[rankk][i]-128;
- SR_8P_int(rankk,i,dataXsub,addressStatus);
- }
- }
- void FindCX (int rankk,float dataCX[8][8],float dataC[8][8],int dataXsub[8][8],int addressStatus){
- int k,j;
- for(j=0;j<8;j++){
- for(k=0;k<8;k++){
- dataCX[rankk][j] += dataC[rankk][k] * dataXsub[k][j] ;
- //printf("%f+= %f*%d\n",dataCX[rankk][j], dataC[rankk][k], dataXsub[k][j]);
- }
- SR_8P_float(rankk,j,dataCX,addressStatus);
- }
- }
- void FindY (int rankk,float dataY[8][8],float dataCX[8][8],float dataCT[8][8],int addressStatus){
- int i,j;
- for(i=0;i<8;i++){
- for(j=0;j<8;j++){
- dataY[rankk][i]+=dataCX[rankk][j]*dataCT[j][i];
- }
- SR_8P_float(rankk,i,dataY,addressStatus);
- }
- }
- void FindYq(int rankk,int dataYq[8][8],float dataY[8][8],int dataQ[8][8],int addressStatus){
- int i;
- for(i=0;i<8;i++){
- dataYq[rankk][i] = round(dataY[rankk][i]/dataQ[rankk][i]);
- //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]);
- SR_8P_int(rankk,i,dataYq,addressStatus);
- }
- }
- void printValue_Int(int data[8][8]){
- int i,j;
- for(i=0;i<8;i++){
- for(j=0;j<8;j++){
- printf("%d \t",data[i][j]);
- }
- printf("\n");
- }
- }
- void printValue_Float(float data[8][8]){
- int i,j;
- for(i=0;i<8;i++){
- for(j=0;j<8;j++){
- printf("%.2f \t",data[i][j]);
- }
- printf("\n");
- }
- }
- int main( int argc, char *argv[] )
- {
- double EXE_Start_Time;
- int size,rank;
- MPI_Status status;
- MPI_Init( &argc, &argv );
- MPI_Comm_size(MPI_COMM_WORLD,&size);
- MPI_Comm_rank(MPI_COMM_WORLD,&rank);
- int i,value,j,k;
- int tempX[8][8];
- float CX[8][8]={0}; //CX = C * X
- float Y[8][8]={0}; //Y = CX*CT
- int Xsub128[8][8];
- int Yq[8][8]={0};
- int X[8][8] ={{52,55,61,66,70,61,64,73},
- {63,59,55,90,109,85,69,72},
- {62,59,68,113,144,104,66,73},
- {63,58,71,122,154,106,70,69},
- {67,61,68,104,126,88,68,70},
- {79,65,60,70,77,68,58,75},
- {85,71,64,59,55,61,65,83},
- {87,79,69,68,65,76,78,94}};
- float C[8][8] ={{0.3536,0.3536,0.3536,0.3536,0.3536,0.3536,0.3536,0.3536},
- {0.4904,0.4157,0.2778,0.0975,-0.0975,-0.2778,-0.4157,-0.4904},
- {0.4619,0.1913,-0.1913,-0.4619,-0.4619,-0.1913,0.1913,0.4619},
- {0.4157,-0.0975,-0.4904,-0.2778,0.2778,0.4904,0.0975,-0.4157},
- {0.3536,-0.3536,-0.3536,0.3536,0.3536,-0.3536,-0.3536,0.3536},
- {0.2778,-0.4904,0.0975,0.4157,-0.4157,-0.0975,0.4904,-0.2778},
- {0.1913,-0.4619,0.4157,-0.1913,-0.1913,0.4157,-0.4619,0.1913},
- {0.0975,-0.2778,0.4619,-0.4904,0.4904,-0.4619,0.2778,-0.0975}};
- float CT[8][8] ={{0.3536,0.4904,0.4619,0.4157,0.3536,0.2778,0.1913,0.0975},
- {0.3536,0.4157,0.1913,-0.0975,-0.3536,-0.4904,-0.4619,-0.2778},
- {0.3536,0.2778,-0.1913,-0.4904,-0.3536,0.0975,0.4157,0.4619},
- {0.3536,0.0975,-0.4619,-0.2778,0.3536,0.4157,-0.1913,-0.4904},
- {0.3536,-0.0975,-0.4619,0.2778,0.3536,-0.4157,-0.1913,0.4904},
- {0.3536,-0.2778,-0.1913,0.4904,-0.3536,-0.0975,0.4157,-0.4619},
- {0.3536,-0.4157,0.1913,0.0975,-0.3536,0.4904,-0.4619,0.2778},
- {0.3536,-0.4904,0.4619,-0.4157,0.3536,-0.2778,0.1913,-0.0975}};
- int Q[8][8] = {{16,11,10,16,24,40,51,61},
- {12,12,14,19,26,58,60,55},
- {14,13,16,24,40,57,69,56},
- {14,17,22,29,51,87,80,62},
- {18,22,37,56,68,109,103,77},
- {24,35,55,64,81,104,113,92},
- {49,64,78,87,103,121,120,101},
- {72,92,95,98,112,100,103,99}};
- switch(rank)
- {
- case 0 : { EXE_Start_Time = MPI_Wtime();
- FindXsub(rank,Xsub128,X,&status);
- FindCX(rank,CX,C,Xsub128,&status);
- FindY(rank,Y,CX,CT,&status);
- FindYq(rank,Yq,Y,Q,&status);
- printf("\n\n------------------------------------------------------------------------- \n");
- printf("X-128 \n");
- printf("------------------------------------------------------------------------- \n");
- printValue_Int(Xsub128);
- printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
- }break;
- case 1 : { EXE_Start_Time = MPI_Wtime();
- FindXsub(rank,Xsub128,X,&status);
- FindCX(rank,CX,C,Xsub128,&status);
- FindY(rank,Y,CX,CT,&status);
- FindYq(rank,Yq,Y,Q,&status);
- printf("\n\n------------------------------------------------------------------------- \n");
- printf("CX \n");
- printf("------------------------------------------------------------------------- \n");
- printValue_Float(CX);
- printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
- }break;
- case 2 : { EXE_Start_Time = MPI_Wtime();
- FindXsub(rank,Xsub128,X,&status);
- FindCX(rank,CX,C,Xsub128,&status);
- FindY(rank,Y,CX,CT,&status);
- FindYq(rank,Yq,Y,Q,&status);
- printf("\n\n------------------------------------------------------------------------- \n");
- printf("Y \n");
- printf("------------------------------------------------------------------------- \n");
- printValue_Float(CX);
- printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
- }break;
- case 3 : { EXE_Start_Time = MPI_Wtime();
- FindXsub(rank,Xsub128,X,&status);
- FindCX(rank,CX,C,Xsub128,&status);
- FindY(rank,Y,CX,CT,&status);
- FindYq(rank,Yq,Y,Q,&status);
- printf("\n\n------------------------------------------------------------------------- \n");
- printf("Yq \n");
- printf("------------------------------------------------------------------------- \n");
- printValue_Int(Yq);
- printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
- }break;
- case 4 : { EXE_Start_Time = MPI_Wtime();
- FindXsub(rank,Xsub128,X,&status);
- FindCX(rank,CX,C,Xsub128,&status);
- FindY(rank,Y,CX,CT,&status);
- FindYq(rank,Yq,Y,Q,&status);
- printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
- }break;
- case 5 : { EXE_Start_Time = MPI_Wtime();
- FindXsub(rank,Xsub128,X,&status);
- FindCX(rank,CX,C,Xsub128,&status);
- FindY(rank,Y,CX,CT,&status);
- FindYq(rank,Yq,Y,Q,&status);
- printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
- }break;
- case 6 : { EXE_Start_Time = MPI_Wtime();
- FindXsub(rank,Xsub128,X,&status);
- FindCX(rank,CX,C,Xsub128,&status);
- FindY(rank,Y,CX,CT,&status);
- FindYq(rank,Yq,Y,Q,&status);
- printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
- }break;
- case 7 : { EXE_Start_Time = MPI_Wtime();
- FindXsub(rank,Xsub128,X,&status);
- FindCX(rank,CX,C,Xsub128,&status);
- FindY(rank,Y,CX,CT,&status);
- FindYq(rank,Yq,Y,Q,&status);
- printf("\nExecution Time of rank %d : %.4f s\n",rank,MPI_Wtime()-EXE_Start_Time);
- }break;
- }
- MPI_Finalize();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment