#include #include #include #include #define CMD_MAXLEN 4096 #define CMD_MASTER 0 #define TAG_AVAIL 1 #define TAG_CMD 2 void read_and_exec(char *filename); void read_and_send(int slaves, char *filename); void recv_and_exec(int rank); void read_next_command(FILE *fl, char *cmd); void exec_command(char *cmd, int rank); int main(int argc,char **argv) { FILE *fl; int rank,size; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); if (rank == CMD_MASTER) printf("master is %d , nb slaves: %d\n", CMD_MASTER,size-1); if (size == 1) read_and_exec(argv[1]); else if(size != 1 && rank == CMD_MASTER) read_and_send(size-1,argv[1]); else recv_and_exec(rank); MPI_Finalize(); } void read_and_exec(char *filename) { FILE *fl; char cmd[CMD_MAXLEN]; double t; fl = fopen(filename,"r"); do { read_next_command(fl,cmd); if(!strlen(cmd)) break; exec_command(cmd,CMD_MASTER); } while (strlen(cmd)); fclose(fl); } void read_and_send(int slaves,char *filename) { int i, num; MPI_Status status; FILE *fl; char cmd[CMD_MAXLEN]; fl = fopen(filename,"r"); i=0; do { read_next_command(fl,cmd); MPI_Recv(&num,1,MPI_INT,MPI_ANY_SOURCE, TAG_AVAIL,MPI_COMM_WORLD,&status); MPI_Send(cmd,CMD_MAXLEN,MPI_CHAR,num, TAG_CMD,MPI_COMM_WORLD); if (!strlen(cmd)) /* terminate command sent */ i++; } while (i < slaves); fclose(fl); } void recv_and_exec(int rank) { char cmd[CMD_MAXLEN]; MPI_Status status; do { MPI_Send(&rank,1,MPI_INT,CMD_MASTER, TAG_AVAIL,MPI_COMM_WORLD); MPI_Recv(cmd,CMD_MAXLEN,MPI_CHAR,CMD_MASTER, TAG_CMD,MPI_COMM_WORLD,&status); if(!strlen(cmd)) /* terminate command */ break; exec_command(cmd,rank); } while (strlen(cmd)); } void read_next_command(FILE *fl,char *cmd) { if(!fgets(cmd,CMD_MAXLEN,fl)) cmd[0]='\0'; if(cmd[strlen(cmd)-1]=='\n') cmd[strlen(cmd)-1]='\0'; } void exec_command(char *cmd, int rank) { double t; int r; t = MPI_Wtime(); r=system(cmd); t = MPI_Wtime() - t; fprintf(stderr,"#executed by process\t%d in %gs\twith status\t%d : %s\n", rank,t,r,cmd); }