/* -*- Mode: C; c-basic-offset:4 ; -*- */ #include "mpi.h" #include #include int main(int argc, char* argv[]) { int ID, NumberProcesses; char ProcessorName[MPI_MAX_PROCESSOR_NAME]; int ProcessorNameLength; int *UniverseSize, Flag; MPI_Comm InterComm, IntraComm; MPI_Init(&argc, &argv); if (argc != 2) { fprintf(stderr, "usage: %s [./Spawn | ./SpawnChild]\n", argv[0]); fflush(stderr); MPI_Abort(MPI_COMM_WORLD, 1); } MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, &UniverseSize, &Flag); MPI_Comm_size(MPI_COMM_WORLD, &NumberProcesses); MPI_Comm_rank(MPI_COMM_WORLD, &ID); if (Flag && (*UniverseSize > 1) && (NumberProcesses == 1)) { MPI_Comm_get_parent(&InterComm); if (InterComm == MPI_COMM_NULL) { int Error; int* ErrorCodes; ErrorCodes = (int*) calloc(*UniverseSize - 1, sizeof(int)); printf("Spawn %d children\n", *UniverseSize - 1); Error = MPI_Comm_spawn(argv[1], MPI_ARGV_NULL, *UniverseSize - 1, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &InterComm, ErrorCodes); if (Error) printf("Can't spawn child processes\n"); MPI_Intercomm_merge(InterComm, 0, &IntraComm); free(ErrorCodes); } else MPI_Intercomm_merge(InterComm, 1, &IntraComm); MPI_Comm_size(IntraComm, &NumberProcesses); MPI_Comm_rank(IntraComm, &ID); } MPI_Get_processor_name(ProcessorName, &ProcessorNameLength); printf("Start process %d of %d on %s in universe of %d\n", ID, NumberProcesses, ProcessorName, *UniverseSize); MPI_Finalize(); return 0; }