/*****************************************************************************\ * test38.7.prog.c - Simple ping test of operation with Slurm. ***************************************************************************** * Copyright (C) 2004 The Regents of the University of California. * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). * Written by Dong Ang * CODE-OCEC-09-009. All rights reserved. * * This file is part of Slurm, a resource management program. * For details, see . * Please also read the included file: DISCLAIMER. * * Slurm is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * Slurm is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along * with Slurm; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. \*****************************************************************************/ #include #include #include #include #include #include #define BUF_SIZE 64 #define COMM_TAG 1000 #define ITERATIONS 1 typedef struct rank_info { char host[BUF_SIZE]; int rank; } rank_info_t; static void pass_its_neighbor(const int rank, const int size) { struct utsname uts; MPI_Request request[2]; rank_info_t out_buf, in_buf; out_buf.rank = rank; uname(&uts); strncpy(out_buf.host, uts.nodename, BUF_SIZE); out_buf.host[BUF_SIZE - 1] = '\0'; MPI_Irecv((void *)&in_buf, sizeof(rank_info_t), MPI_CHAR, ((rank + size - 1) % size), COMM_TAG, MPI_COMM_WORLD, &request[0]); MPI_Isend((void *)&out_buf, sizeof(rank_info_t), MPI_CHAR, ((rank + 1) % size), COMM_TAG, MPI_COMM_WORLD, &request[1]); MPI_Waitall(2, request, MPI_STATUS_IGNORE); printf("Rank[%d] on %s just received msg from Rank %d on %s\n", rank, uts.nodename, in_buf.rank, in_buf.host); } int main(int argc, char * argv[]) { int i; int size, rank; time_t now; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); for (i = 0; i < ITERATIONS; i++) { if (i) sleep(1); pass_its_neighbor(rank, size); if ((ITERATIONS > 1) && (rank == 0)) { static time_t last_time = 0; now = time(NULL); printf("Iteration:%d Time:%s", i, ctime(&now)); if (last_time && (last_time < (now - 2))) printf("Woke from suspend\n"); last_time = now; } } MPI_Finalize(); return 0; }