/* seqmm.c sequential square matrix multiplication */ #include #include #include #include #include #include #include #include #include "matrix.h" int parse_args(int argc, char *argv[ ], int *size){ if ( (argc != 5) || ((*size = atoi (argv[4])) <= 0) ) { fprintf (stderr, "Usage: %s MatrixA MatrixB MatrixC Size\n", argv[0]); return(-1); }; return(0); } int main(int argc, char *argv[ ]) { int dim; /* matrix dimensions */ if(parse_args(argc,argv,&dim) < 0) exit(0); { int fd[3]; /* A B and C's fd's */ int A[dim+1][dim+1], B[dim+1][dim+1], C[dim+1][dim+1]; /* A B and C */ int i, j, k; /* open files */ if(((fd[0] = open(argv[1], O_RDONLY)) == -1) || ((fd[1] = open(argv[2], O_RDONLY)) == -1) || ((fd[2] = open(argv[3], O_WRONLY | O_CREAT, 0666)) == -1)){ perror("Opening files failed"); exit(EXIT_FAILURE);} /* read A */ for( i = 1; i < dim+1; i++ ) if(get_row(fd[0], dim, i, &A[i][1]) == -1) fprintf(stderr,"Initialization of A failed at row %d\n", i); /* read B */ for( i = 1; i < dim+1; i++ ) if(get_row(fd[1], dim, i, &B[i][1]) == -1) fprintf(stderr,"Initialization of B failed at row %d\n", i); for( i = 1; i < dim+1; i++ ) for( j = 1; j < dim+1; j++ ) { C[i][j] = 0; for( k = 1; k < dim+1; k++ ) C[i][j] += A[i][k] * B[k][j]; } /* write C */ for( i = 1; i < dim+1; i++ ) if(set_row(fd[2], dim, i, &C[i][1]) == -1) fprintf(stderr,"Write of C failed at row %d\n", i); close( fd[0] ); close( fd[1] ); close( fd[2] ); } return 0; } /* end of main program here */