#include #include "mpi.h" #include #include #include #include #include #include #include "mmlib.h" #define SLAVE "mm.0.6-s" #define MAXNTIDS 100 #define MAXROW 100 int parse_args(int, char*[], int*, int*, int *, int [], int); int main(int argc, char* argv[]){ int ntask, my_rank; int m, blksize; int F[3]; int *errcodes; MPI_Comm intercomm; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); if(parse_args(argc, argv, &m, &blksize, &ntask, F, my_rank) < 0){ MPI_Finalize(); exit(0); } errcodes = (int*)calloc(sizeof(int),ntask); if(MPI_Comm_spawn(SLAVE, argv, ntask, MPI_INFO_NULL, my_rank, MPI_COMM_WORLD, &intercomm, errcodes) != MPI_SUCCESS) fprintf(stderr, "Spawn failed!\n"); else fprintf(stderr, "Spawn of %d children successful\n",ntask); MPI_Finalize(); exit(0); } int parse_args(int argc, char *argv[], int *m, int *blksize, int *ntask, int F[], int rank){ int i; if ((argc != 6) || ((*m = atoi(argv[4])) <= 0) || ((*blksize = atoi(argv[5])) <= 0)){ fprintf(stderr, "Usage: %s matrixA matrixB matrixC m blk\n", argv[0]); return(-1); }; if(rank == 0) if(((F[0] = open(argv[1], O_RDONLY)) == -1) || ((F[1] = open(argv[2], O_RDONLY)) == -1) || ((F[2] = open(argv[3], O_WRONLY)) == -1)){ fprintf(stderr, "Usage: %s matrixA matrixB matrixC m blk\n", argv[0]); return(-1); } if(*m > MAXROW){ fprintf(stderr, "m = %d not valid.\n", *m); return(-1); }; *ntask = (*m)*(*m); if ((*ntask < 1) || (*ntask >= MAXNTIDS)) { fprintf(stderr, "ntask in parse_args = %d not valid.\n", *ntask); MPI_Finalize(); return(-1); }; for(i = 0; i < 3; i++)close(F[i]); return(0); }