#include #include #include #include int main(int argc, char* argv[]) { int msg, rc; MPI_Comm child; MPI_Info info; int rank, size; pid_t pid; char *host, *app, *rdir=NULL, *prefix; char cwd[256]; if (argc < 3) { printf("Usage: slave_spawn host prefix-for-host \n"); return 1; } host = argv[1]; prefix = argv[2]; app = "slave"; if (5 == argc) { rdir = argv[4]; } pid = getpid(); printf("Slave_spawn [pid %ld] starting up!\n", (long)pid); MPI_Init(NULL, NULL); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Info_create(&info); MPI_Info_set(info, "host", host); MPI_Info_set(info, "ompi_prefix", prefix); MPI_Info_set(info, "ompi_local_slave", "true"); if (NULL != rdir) { MPI_Info_set(info, "ompi_preload_binary", "true"); MPI_Info_set(info, "ompi_preload_files_dest_dir", rdir); } if (argc == 6) { /* files were specified */ MPI_Info_set(info, "ompi_preload_files", argv[5]); MPI_Info_set(info, "ompi_preload_files_src_dir", getcwd(cwd, 256)); } pid = getpid(); printf("Slave_spawn [pid %ld] about to spawn!\n", (long)pid); if (MPI_SUCCESS != (rc = MPI_Comm_spawn(app, MPI_ARGV_NULL, 1, info, 0, MPI_COMM_SELF, &child, MPI_ERRCODES_IGNORE))) { printf("Slave failed to spawn\n"); return rc; } printf("Slave_spawn done with spawn\n"); msg = 38; printf("Slave_spawn sending message to child\n"); MPI_Send(&msg, 1, MPI_INT, 0, 1, child); MPI_Comm_disconnect(&child); printf("Slave_spawn disconnected\n"); MPI_Info_free(&info); MPI_Finalize(); fprintf(stderr, "%d: exiting\n", pid); return 0; }