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 DX[8][8]={0}; //DX = T * X
- float D[8][8]={0}; //D = DX*RT
- int Xsub128[8][8];
- int C[8][8]={0};
- int X[8][8] ={{154,123,123,123,123,123,123,136},
- {192,180,136,154,154,154,136,110},
- {254,198,154,154,180,154,123,123},
- {239,180,136,180,180,166,123,123},
- {180,154,136,167,166,149,136,136},
- {128,136,123,136,154,180,198,154},
- {123,105,110,149,136,136,180,166},
- {110,136,123,123,123,136,154,136}};
- float T[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 RT[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,DX,T,Xsub128,&status);
- FindY(rank,D,DX,RT,&status);
- FindYq(rank,C,D,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,DX,T,Xsub128,&status);
- FindY(rank,D,DX,RT,&status);
- FindYq(rank,C,D,Q,&status);
- printf("\n\n------------------------------------------------------------------------- \n");
- printf("DX \n");
- printf("------------------------------------------------------------------------- \n");
- printValue_Float(DX);
- 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,DX,T,Xsub128,&status);
- FindY(rank,D,DX,RT,&status);
- FindYq(rank,C,D,Q,&status);
- printf("\n\n------------------------------------------------------------------------- \n");
- printf("D \n");
- printf("------------------------------------------------------------------------- \n");
- printValue_Float(D);
- 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,DX,T,Xsub128,&status);
- FindY(rank,D,DX,RT,&status);
- FindYq(rank,C,D,Q,&status);
- printf("\n\n------------------------------------------------------------------------- \n");
- printf("C \n");
- printf("------------------------------------------------------------------------- \n");
- printValue_Int(C);
- 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,DX,T,Xsub128,&status);
- FindY(rank,D,DX,RT,&status);
- FindYq(rank,C,D,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,DX,T,Xsub128,&status);
- FindY(rank,D,DX,RT,&status);
- FindYq(rank,C,D,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,DX,T,Xsub128,&status);
- FindY(rank,D,DX,RT,&status);
- FindYq(rank,C,D,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,DX,T,Xsub128,&status);
- FindY(rank,D,DX,RT,&status);
- FindYq(rank,C,D,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