Assignment Number 3: Beowolf Cluster #include #include # include # include # define WORKTAG 1 # define DIETAG 2 struct Work { int dimension; int xStartPnt; int yStartPnt; int zStartPnt; int noOfSteps; } *workList; struct Result { int xStartPnt; int yStartPnt; int zStartPnt; int xEndPnt; int yEndPnt; int zEndPnt; }; void setInitPointForRandWalks(int,int,int); void masterProcess(int,int,int, MPI_Datatype, MPI_Datatype); struct Work getNextWorkItem(void); void slaveProcess(int, MPI_Datatype, MPI_Datatype); struct Result getResultOfRandomWalk(struct Work); MPI_Datatype getResultStructObject(); MPI_Datatype getWorkStructObject(); int main(int argc, char **argv) { int rank; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); int n=atoi(argv[1]); int s=atoi(argv[2]);; int w=atoi(argv[3]);; if (rank == 0) {// masterProcess process masterProcess(n, s, w, getWorkStructObject(), getResultStructObject()); } else { //rank=1, 2, 3 slaveProcess processes slaveProcess(rank, getWorkStructObject(), getResultStructObject()); } MPI_Finalize(); return 0; } MPI_Datatype getResultStructObject() { struct Result result; MPI_Datatype resultStructTypeObj; MPI_Datatype type[6] = {MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT}; int blocklen[6] = {1, 1, 1,1,1,1}; MPI_Aint displacements[6]; MPI_Aint addresses[7]; MPI_Address( &result, &addresses[0]); MPI_Address( &result.xStartPnt, &addresses[1]); MPI_Address( &result.yStartPnt, &addresses[2]); MPI_Address( &result.zStartPnt, &addresses[3]); MPI_Address( &result.xEndPnt, &addresses[4]); MPI_Address( &result.yEndPnt, &addresses[5]); MPI_Address( &result.zEndPnt, &addresses[6]); displacements[0] = addresses[1] - addresses[0]; displacements[1] = addresses[2] - addresses[0]; displacements[2] = addresses[3] - addresses[0]; displacements[3] = addresses[4] - addresses[0]; displacements[4] = addresses[5] - addresses[0]; displacements[5] = addresses[6] - addresses[0]; MPI_Type_struct(6, blocklen, displacements, type, &resultStructTypeObj); MPI_Type_commit(&resultStructTypeObj); return resultStructTypeObj; } void setInitPointForRandWalks(int n,int s,int w) { workList = calloc(w, sizeof(struct Work)); int i=0; for(i=0; i 1) { xCurrentPnt--; } } else { rangeStart = rangeStart + width; width = (n - xCurrentPnt) * yCurrentPnt * (n - zCurrentPnt); if (rangeStart <= randomNo && randomNo < (rangeStart + width)) { if (yCurrentPnt < n) { yCurrentPnt++; } } else { rangeStart = rangeStart + width; width = xCurrentPnt * (n - yCurrentPnt) * zCurrentPnt; if (rangeStart <= randomNo && randomNo < (rangeStart + width)) { if (yCurrentPnt > 1) { yCurrentPnt--; } } else { rangeStart = rangeStart + width; width = (n - xCurrentPnt) * (n - yCurrentPnt) * zCurrentPnt; if (rangeStart <= randomNo && randomNo < (rangeStart + width)) { if (zCurrentPnt < n) { zCurrentPnt++; } } else { rangeStart = rangeStart + width; width = xCurrentPnt * yCurrentPnt * (n - zCurrentPnt); if (rangeStart <= randomNo && randomNo < (rangeStart + width)) { if (zCurrentPnt > 1) { zCurrentPnt--; } } } } } } } } result.xStartPnt=work.xStartPnt; result.yStartPnt=work.yStartPnt; result.zStartPnt=work.zStartPnt; result.xEndPnt=xCurrentPnt; result.yEndPnt=yCurrentPnt; result.zEndPnt=zCurrentPnt; return result; }