#include <stdio.h> #include <unistd.h> #include <limits.h> #include "mpi.h" int main(int argc, char** argv) { int me, nproc, *iop, iorank, flag, input; char hostname[PATH_MAX]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &nproc); MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_IO, &iop, &flag); if(!flag){ fprintf(stderr, "MPI_Attr_get failed, exiting\n"); goto exit; } if(gethostname(hostname, PATH_MAX) != 0){ fprintf(stderr, "gethostname failed, exiting\n"); goto exit; } fprintf(stderr, "Clone %3d @ %s got %d in iop (MPI_PROC_NULL == %d, MPI_ANY_SOURCE == %d)\n", me, hostname, *iop, MPI_PROC_NULL, MPI_ANY_SOURCE); if(*iop == MPI_PROC_NULL){ fprintf(stderr, "Noone can do IO!\n"); goto exit; } if(*iop == MPI_ANY_SOURCE){ fprintf(stderr, "Any Clone can IO!\n"); iorank = nproc - 1; *iop = nproc - 1; } MPI_Allreduce(iop, &iorank, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD); fprintf(stderr, "Clone %3d iorank = %d!\n", me, iorank); MPI_Barrier(MPI_COMM_WORLD); if(me == iorank){ fprintf(stderr, "I'm Clone %3d and I'm the chosen one to do IO!\n", iorank); fprintf(stderr, "Give me a number\n"); scanf("%d", &input); fprintf(stderr, "You gave me %d\n", input); } MPI_Bcast(&input, 1, MPI_INT, iorank, MPI_COMM_WORLD); fprintf(stderr, "Clone %3d input = %d!\n", me, input); exit: MPI_Finalize(); return 0; }