From f038f8ce5cff2d66490440b2e83cac2dfaa43603 Mon Sep 17 00:00:00 2001 From: "Kasper D. Fischer" Date: Mon, 26 Aug 2024 18:27:55 +0200 Subject: [PATCH] adding source and scripts for ompi testing scripts provided scripts: * ompi_connectivity.sh * ompi_hello.sh * ompi_ring.sh --- .gitignore | 12 +++ examples/jobs/ompi_connectivity.sh | 1 + examples/jobs/ompi_hello.sh | 1 + examples/jobs/ompi_ring.sh | 1 + local/examples/jobs/ompi_connectivity.sh | 23 ++++++ local/examples/jobs/ompi_hello.sh | 23 ++++++ local/examples/jobs/ompi_ring.sh | 23 ++++++ local/examples/src/OpenMPI/Makefile | 77 +++++++++++++++++++ local/examples/src/OpenMPI/Makefile.include | 42 +++++++++++ local/examples/src/OpenMPI/README | 46 ++++++++++++ local/examples/src/OpenMPI/connectivity_c.c | 67 +++++++++++++++++ local/examples/src/OpenMPI/hello_c.c | 25 +++++++ local/examples/src/OpenMPI/hello_cxx.cc | 24 ++++++ local/examples/src/OpenMPI/hello_f77 | Bin 0 -> 29272 bytes local/examples/src/OpenMPI/hello_f77.f | 20 +++++ local/examples/src/OpenMPI/hello_f90 | Bin 0 -> 19112 bytes local/examples/src/OpenMPI/hello_f90.f90 | 21 ++++++ local/examples/src/OpenMPI/install.sh | 12 +++ local/examples/src/OpenMPI/ring_c.c | 79 ++++++++++++++++++++ local/examples/src/OpenMPI/ring_cxx.cc | 78 +++++++++++++++++++ local/examples/src/OpenMPI/ring_f77 | Bin 0 -> 29704 bytes local/examples/src/OpenMPI/ring_f77.f | 78 +++++++++++++++++++ local/examples/src/OpenMPI/ring_f90 | Bin 0 -> 19552 bytes local/examples/src/OpenMPI/ring_f90.f90 | 73 ++++++++++++++++++ 24 files changed, 726 insertions(+) create mode 120000 examples/jobs/ompi_connectivity.sh create mode 120000 examples/jobs/ompi_hello.sh create mode 120000 examples/jobs/ompi_ring.sh create mode 100755 local/examples/jobs/ompi_connectivity.sh create mode 100755 local/examples/jobs/ompi_hello.sh create mode 100755 local/examples/jobs/ompi_ring.sh create mode 100644 local/examples/src/OpenMPI/Makefile create mode 100644 local/examples/src/OpenMPI/Makefile.include create mode 100644 local/examples/src/OpenMPI/README create mode 100644 local/examples/src/OpenMPI/connectivity_c.c create mode 100644 local/examples/src/OpenMPI/hello_c.c create mode 100644 local/examples/src/OpenMPI/hello_cxx.cc create mode 100644 local/examples/src/OpenMPI/hello_f77 create mode 100644 local/examples/src/OpenMPI/hello_f77.f create mode 100644 local/examples/src/OpenMPI/hello_f90 create mode 100644 local/examples/src/OpenMPI/hello_f90.f90 create mode 100755 local/examples/src/OpenMPI/install.sh create mode 100644 local/examples/src/OpenMPI/ring_c.c create mode 100644 local/examples/src/OpenMPI/ring_cxx.cc create mode 100644 local/examples/src/OpenMPI/ring_f77 create mode 100644 local/examples/src/OpenMPI/ring_f77.f create mode 100644 local/examples/src/OpenMPI/ring_f90 create mode 100644 local/examples/src/OpenMPI/ring_f90.f90 diff --git a/.gitignore b/.gitignore index e077508..1581228 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,15 @@ spool/minos15 spool/minos26 spool/minos27 spool/qmaster/users +local/examples/src/OpenMPI/connectivity_c +local/examples/src/OpenMPI/hello_c +local/examples/src/OpenMPI/hello_cxx +local/examples/src/OpenMPI/hello_f77 +local/examples/src/OpenMPI/hello_f90 +local/examples/src/OpenMPI/ring_c +local/examples/src/OpenMPI/ring_cxx +local/examples/src/OpenMPI/ring_f77 +local/examples/src/OpenMPI/ring_f90 +local/examples/jobsbin/ompi_connectivity_* +local/examples/jobsbin/ompi_hello_* +local/examples/jobsbin/ompi_ring_* diff --git a/examples/jobs/ompi_connectivity.sh b/examples/jobs/ompi_connectivity.sh new file mode 120000 index 0000000..c845229 --- /dev/null +++ b/examples/jobs/ompi_connectivity.sh @@ -0,0 +1 @@ +../../local/examples/jobs/ompi_connectivity.sh \ No newline at end of file diff --git a/examples/jobs/ompi_hello.sh b/examples/jobs/ompi_hello.sh new file mode 120000 index 0000000..1a895f4 --- /dev/null +++ b/examples/jobs/ompi_hello.sh @@ -0,0 +1 @@ +../../local/examples/jobs/ompi_hello.sh \ No newline at end of file diff --git a/examples/jobs/ompi_ring.sh b/examples/jobs/ompi_ring.sh new file mode 120000 index 0000000..2b3fd88 --- /dev/null +++ b/examples/jobs/ompi_ring.sh @@ -0,0 +1 @@ +../../local/examples/jobs/ompi_ring.sh \ No newline at end of file diff --git a/local/examples/jobs/ompi_connectivity.sh b/local/examples/jobs/ompi_connectivity.sh new file mode 100755 index 0000000..494ff66 --- /dev/null +++ b/local/examples/jobs/ompi_connectivity.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# This is a simple example of a SGE batch script +#$ -pe mpi-rr 4-20 +#$ -l low + +# request Bourne shell as shell for job +#$ -S /bin/bash + +# +# print hostname +hostname +# print date and time +date +if [ "X$PE_HOSTFILE" != "X" ]; then + # print pe_hostfile + cat $PE_HOSTFILE + # Run ompi_connectivity + echo Starting OpenMPI job. + mpirun -v /data/gridengine/local/examples/jobsbin/ompi_connectivity_`/usr/bin/lsb_release -cs` +fi +# print date and time again +date diff --git a/local/examples/jobs/ompi_hello.sh b/local/examples/jobs/ompi_hello.sh new file mode 100755 index 0000000..f80f4e0 --- /dev/null +++ b/local/examples/jobs/ompi_hello.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# This is a simple example of a SGE batch script +#$ -pe mpi-rr 4-20 +#$ -l low + +# request Bourne shell as shell for job +#$ -S /bin/bash + +# +# print hostname +hostname +# print date and time +date +if [ "X$PE_HOSTFILE" != "X" ]; then + # print pe_hostfile + cat $PE_HOSTFILE + # Run ompi_hello + echo Starting OpenMPI job. + mpirun -v /data/gridengine/local/examples/jobsbin/ompi_hello_$(/usr/bin/lsb_release -cs) +fi +# print date and time again +date diff --git a/local/examples/jobs/ompi_ring.sh b/local/examples/jobs/ompi_ring.sh new file mode 100755 index 0000000..6a2e748 --- /dev/null +++ b/local/examples/jobs/ompi_ring.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# This is a simple example of a SGE batch script +#$ -pe mpi-rr 4-20 +#$ -l low + +# request Bourne shell as shell for job +#$ -S /bin/bash + +# +# print hostname +hostname +# print date and time +date +if [ "X$PE_HOSTFILE" != "X" ]; then + # print pe_hostfile + cat $PE_HOSTFILE + # Run ompi_ring + echo Starting OpenMPI job. + mpirun -v /data/gridengine/local/examples/jobsbin/ompi_ring_`/usr/bin/lsb_release -cs` +fi +# print date and time again +date diff --git a/local/examples/src/OpenMPI/Makefile b/local/examples/src/OpenMPI/Makefile new file mode 100644 index 0000000..321fd9a --- /dev/null +++ b/local/examples/src/OpenMPI/Makefile @@ -0,0 +1,77 @@ +# +# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana +# University Research and Technology +# Corporation. All rights reserved. +# Copyright (c) 2004-2005 The University of Tennessee and The University +# of Tennessee Research Foundation. All rights +# reserved. +# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, +# University of Stuttgart. All rights reserved. +# Copyright (c) 2004-2005 The Regents of the University of California. +# All rights reserved. +# Copyright (c) 2006-2007 Sun Microsystems, Inc. All rights reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# + +# Use the Open MPI-provided wrapper compilers. Note that gmake +# requires the CXX macro, while other versions of make (such as Sun's +# make) require the CCC macro. + +CC = mpicc +CXX = mpic++ +CCC = mpic++ +F77 = mpif77 +FC = mpif90 + +# Using -g is not necessary, but it is helpful for example programs, +# especially if users want to examine them with debuggers. Note that +# gmake requires the CXXFLAGS macro, while other versions of make +# (such as Sun's make) require the CCFLAGS macro. + +CFLAGS = -g +CXXFLAGS = -g +CCFLAGS = -g +F77FLAGS = -g +FCFLAGS = -g + +# Example programs to build + +EXAMPLES = hello_c hello_cxx hello_f77 hello_f90 \ + ring_c ring_cxx ring_f77 ring_f90 connectivity_c + +# Default target. Always build the C example. Only build the others +# if Open MPI was build with the relevant language bindings. + +all: hello_c ring_c connectivity_c + @ if test "`ompi_info --parsable | grep bindings:cxx:yes`" != ""; then \ + $(MAKE) hello_cxx ring_cxx; \ + fi + @ if test "`ompi_info --parsable | grep bindings:f77:yes`" != ""; then \ + $(MAKE) hello_f77 ring_f77; \ + fi + @ if test "`ompi_info --parsable | grep bindings:f90:yes`" != ""; then \ + $(MAKE) hello_f90 ring_f90; \ + fi + + +# The usual "clean" target + +clean: + rm -f $(EXAMPLES) *~ *.o + +# Don't rely on default rules for the fortran examples + +hello_f77: hello_f77.f + $(F77) $(F77FLAGS) $^ -o $@ +ring_f77: ring_f77.f + $(F77) $(F77FLAGS) $^ -o $@ + +hello_f90: hello_f90.f90 + $(FC) $(FCFLAGS) $^ -o $@ +ring_f90: ring_f90.f90 + $(FC) $(FCFLAGS) $^ -o $@ + diff --git a/local/examples/src/OpenMPI/Makefile.include b/local/examples/src/OpenMPI/Makefile.include new file mode 100644 index 0000000..724ccdf --- /dev/null +++ b/local/examples/src/OpenMPI/Makefile.include @@ -0,0 +1,42 @@ +# -*- makefile -*- +# +# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana +# University Research and Technology +# Corporation. All rights reserved. +# Copyright (c) 2004-2005 The University of Tennessee and The University +# of Tennessee Research Foundation. All rights +# reserved. +# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, +# University of Stuttgart. All rights reserved. +# Copyright (c) 2004-2005 The Regents of the University of California. +# All rights reserved. +# Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. +# Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# + +# Note that this file does not stand on its own. It is included by a +# higher-level Makefile so that Automake features such as "make dist" +# work properly (and include all the relevant files in this directory +# in the distribution tarball). + +# If you are looking for the file that builds these examples, look at +# "Makefile" in this same directory (it is *NOT* generated by +# Automake). + +EXTRA_DIST += \ + examples/README \ + examples/Makefile \ + examples/hello_c.c \ + examples/hello_cxx.cc \ + examples/hello_f77.f \ + examples/hello_f90.f90 \ + examples/ring_c.c \ + examples/ring_cxx.cc \ + examples/ring_f77.f \ + examples/ring_f90.f90 \ + examples/connectivity_c.c diff --git a/local/examples/src/OpenMPI/README b/local/examples/src/OpenMPI/README new file mode 100644 index 0000000..02203f4 --- /dev/null +++ b/local/examples/src/OpenMPI/README @@ -0,0 +1,46 @@ +Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana + University Research and Technology + Corporation. All rights reserved. +Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. +Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. + +The files in this directory are sample MPI applications provided both +as a trivial primer to MPI as well as simple tests to ensure that your +Open MPI installation is working properly. + +If you are looking for a comprehensive MPI tutorial, these samples are +not enough. An excellent MPI tutorial is available here: + + http://webct.ncsa.uiuc.edu:8900/public/MPI/ + +There are 2 MPI examples in this directory, each in four languages: + +- Hello world + C: hello_c.c + C++: hello_cxx.cc + F77: hello_f77.f + F90: hello_f90.f90 + +- Send a trivial message around in a ring + C: ring_c.c + C++: ring_cxx.cc + F77: ring_f77.f + F90: ring_f90.f90 + +- Test the connectivity between all processes + C: connectivity_c.c + +The Makefile in this directory will build as many of the examples as +you have language support (e.g., if you do not have F90 bindings +compiled as part of Open MPI, the F90 examples will be skipped). + +The Makefile assumes that the wrapper compilers mpicc, mpic++, mpif77, +and mpif90 are in your path. + +Although the Makefile is tailored for Open MPI (e.g., it checks the +"ompi_info" command to see if you have support for C++, F77, and F90), +all of the example programs are pure MPI, and therefore not specific +to Open MPI. Hence, you can use a different MPI implementation to +complie and run these programs if you wish. + +Make today an Open MPI day! diff --git a/local/examples/src/OpenMPI/connectivity_c.c b/local/examples/src/OpenMPI/connectivity_c.c new file mode 100644 index 0000000..f52c8a3 --- /dev/null +++ b/local/examples/src/OpenMPI/connectivity_c.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. + */ + +/* + * Test the connectivity between all processes. + */ + +#include +#include +#include +#include +#include +#include +#include + +int +main(int argc, char **argv) +{ + MPI_Status status; + int verbose = 0; + int rank; + int np; /* number of processes in job */ + int peer; + int i; + int j; + int length; + char name[MPI_MAX_PROCESSOR_NAME+1]; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &np); + + /* + * If we cannot get the name for whatever reason, just + * set it to unknown. */ + if (MPI_SUCCESS != MPI_Get_processor_name(name, &length)) { + strcpy(name, "unknown"); + } + + if (argc>1 && strcmp(argv[1], "-v")==0) + verbose = 1; + + for (i=0; ii) { + /* receive from and reply to rank i */ + MPI_Recv(&peer, 1, MPI_INT, i, i, MPI_COMM_WORLD, &status); + MPI_Send(&rank, 1, MPI_INT, i, rank, MPI_COMM_WORLD); + } + } + + MPI_Barrier(MPI_COMM_WORLD); + if (rank==0) + printf("Connectivity test on %d processes PASSED.\n", np); + + MPI_Finalize(); + return 0; +} diff --git a/local/examples/src/OpenMPI/hello_c.c b/local/examples/src/OpenMPI/hello_c.c new file mode 100644 index 0000000..75c1aa7 --- /dev/null +++ b/local/examples/src/OpenMPI/hello_c.c @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. + * + * Sample MPI "hello world" application in C + */ + +#include +#include "mpi.h" + +int main(int argc, char* argv[]) +{ + int rank, size; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + printf("Hello, world, I am %d of %d\n", rank, size); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Finalize(); + + return 0; +} diff --git a/local/examples/src/OpenMPI/hello_cxx.cc b/local/examples/src/OpenMPI/hello_cxx.cc new file mode 100644 index 0000000..6047266 --- /dev/null +++ b/local/examples/src/OpenMPI/hello_cxx.cc @@ -0,0 +1,24 @@ +// +// Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana +// University Research and Technology +// Corporation. All rights reserved. +// Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. +// +// Sample MPI "hello world" application in C++ +// + +#include "mpi.h" +#include + +int main(int argc, char **argv) +{ + int rank, size; + + MPI::Init(); + rank = MPI::COMM_WORLD.Get_rank(); + size = MPI::COMM_WORLD.Get_size(); + std::cout << "Hello, world! I am " << rank << " of " << size << std::endl; + MPI::Finalize(); + + return 0; +} diff --git a/local/examples/src/OpenMPI/hello_f77 b/local/examples/src/OpenMPI/hello_f77 new file mode 100644 index 0000000000000000000000000000000000000000..1294d2f7cda608d72e04cabbdfcc29eb3091c2d4 GIT binary patch literal 29272 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 u>8Mr>|NjIV7at=4 literal 0 HcmV?d00001 diff --git a/local/examples/src/OpenMPI/hello_f77.f b/local/examples/src/OpenMPI/hello_f77.f new file mode 100644 index 0000000..684b5d9 --- /dev/null +++ b/local/examples/src/OpenMPI/hello_f77.f @@ -0,0 +1,20 @@ +C +C Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana +C University Research and Technology +C Corporation. All rights reserved. +C Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. +C +C Sample MPI "hello world" application in Fortran 77 +C + program main + implicit none + include 'mpif.h' + integer ierr, rank, size + + call MPI_INIT(ierr) + call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) + call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) + print *, "Hello, world, I am ", rank, " of ", size + call MPI_FINALIZE(ierr) + + end diff --git a/local/examples/src/OpenMPI/hello_f90 b/local/examples/src/OpenMPI/hello_f90 new file mode 100644 index 0000000000000000000000000000000000000000..c653ea10ff166f028a25138103e8266587107837 GIT binary patch literal 19112 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 +#include "mpi.h" + +int main(int argc, char *argv[]) +{ + int rank, size, next, prev, message, tag = 201; + + /* Start up MPI */ + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + /* Calculate the rank of the next process in the ring. Use the + modulus operator so that the last process "wraps around" to + rank zero. */ + + next = (rank + 1) % size; + prev = (rank + size - 1) % size; + + /* If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), + put the number of times to go around the ring in the + message. */ + + if (0 == rank) { + message = 10; + + printf("Process 0 sending %d to %d, tag %d (%d processes in ring)\n", + message, next, tag, size); + MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD); + printf("Process 0 sent to %d\n", next); + } + + /* Pass the message around the ring. The exit mechanism works as + follows: the message (a positive integer) is passed around the + ring. Each time it passes rank 0, it is decremented. When + each processes receives a message containing a 0 value, it + passes the message on to the next process and then quits. By + passing the 0 message first, every process gets the 0 message + and can quit normally. */ + + while (1) { + MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD, + MPI_STATUS_IGNORE); + + if (0 == rank) { + --message; + printf("Process 0 decremented value: %d\n", message); + } + + MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD); + if (0 == message) { + printf("Process %d exiting\n", rank); + break; + } + } + + /* The last process does one extra send to process 0, which needs + to be received before the program can exit */ + + if (0 == rank) { + MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD, + MPI_STATUS_IGNORE); + } + + /* All done */ + + MPI_Finalize(); + return 0; +} diff --git a/local/examples/src/OpenMPI/ring_cxx.cc b/local/examples/src/OpenMPI/ring_cxx.cc new file mode 100644 index 0000000..3ec3d9c --- /dev/null +++ b/local/examples/src/OpenMPI/ring_cxx.cc @@ -0,0 +1,78 @@ +// +// Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana +// University Research and Technology +// Corporation. All rights reserved. +// Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. +// +// Simple ring test program +// + +#include "mpi.h" +#include + +int main(int argc, char *argv[]) +{ + int rank, size, next, prev, message, tag = 201; + + // Start up MPI + + MPI::Init(); + rank = MPI::COMM_WORLD.Get_rank(); + size = MPI::COMM_WORLD.Get_size(); + + // Calculate the rank of the next process in the ring. Use the + // modulus operator so that the last process "wraps around" to + // rank zero. + + next = (rank + 1) % size; + prev = (rank + size - 1) % size; + + // If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), + // put the number of times to go around the ring in the message. + + if (0 == rank) { + message = 10; + + std::cout << "Process 0 sending " << message << " to " << next + << ", tag " << tag << " (" << size << " processes in ring)" + << std::endl; + MPI::COMM_WORLD.Send(&message, 1, MPI::INT, next, tag); + std::cout << "Process 0 sent to " << next << std::endl; + } + + // Pass the message around the ring. The exit mechanism works as + // follows: the message (a positive integer) is passed around the + // ring. Each time it passes rank 0, it is decremented. When + // each processes receives a message containing a 0 value, it + // passes the message on to the next process and then quits. By + // passing the 0 message first, every process gets the 0 message + // and can quit normally. + + while (1) { + MPI::COMM_WORLD.Recv(&message, 1, MPI::INT, prev, tag); + + if (0 == rank) { + --message; + std::cout << "Process 0 decremented value: " << message + << std::endl; + } + + MPI::COMM_WORLD.Send(&message, 1, MPI::INT, next, tag); + if (0 == message) { + std::cout << "Process " << rank << " exiting" << std::endl; + break; + } + } + + // The last process does one extra send to process 0, which needs + // to be received before the program can exit */ + + if (0 == rank) { + MPI::COMM_WORLD.Recv(&message, 1, MPI::INT, prev, tag); + } + + // All done + + MPI::Finalize(); + return 0; +} diff --git a/local/examples/src/OpenMPI/ring_f77 b/local/examples/src/OpenMPI/ring_f77 new file mode 100644 index 0000000000000000000000000000000000000000..a9786582a9443982907464e8e6f526435b76c27b GIT binary patch literal 29704 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 literal 0 HcmV?d00001 diff --git a/local/examples/src/OpenMPI/ring_f90.f90 b/local/examples/src/OpenMPI/ring_f90.f90 new file mode 100644 index 0000000..d74fdd2 --- /dev/null +++ b/local/examples/src/OpenMPI/ring_f90.f90 @@ -0,0 +1,73 @@ +! +! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana +! University Research and Technology +! Corporation. All rights reserved. +! Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. +! +! Simple ring test program +! +program ring + use mpi + implicit none + integer :: rank, size, tag, next, from, message, ierr + +! Start up MPI + + call MPI_INIT(ierr) + call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) + call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) + +! Calculate the rank of the next process in the ring. Use the modulus +! operator so that the last process "wraps around" to rank zero. + + tag = 201 + next = mod((rank + 1), size) + from = mod((rank + size - 1), size) + +! If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), put +! the number of times to go around the ring in the message. + + if (rank .eq. 0) then + message = 10 + + print *, 'Process 0 sending ', message, ' to ', next, ' tag ', tag, ' (', size, ' processes in ring)' + call MPI_SEND(message, 1, MPI_INTEGER, next, tag, MPI_COMM_WORLD, ierr) + print *, 'Process 0 sent to ', next + endif + +! Pass the message around the ring. The exit mechanism works as +! follows: the message (a positive integer) is passed around the ring. +! Each time it passes rank 0, it is decremented. When each processes +! receives a message containing a 0 value, it passes the message on to +! the next process and then quits. By passing the 0 message first, +! every process gets the 0 message and can quit normally. + +10 call MPI_RECV(message, 1, MPI_INTEGER, from, tag, MPI_COMM_WORLD, & + MPI_STATUS_IGNORE, ierr) + + if (rank .eq. 0) then + message = message - 1 + print *, 'Process 0 decremented value:', message + endif + + call MPI_SEND(message, 1, MPI_INTEGER, next, tag, MPI_COMM_WORLD, ierr) + + if (message .eq. 0) then + print *, 'Process ', rank, ' exiting' + goto 20 + endif + goto 10 + +! The last process does one extra send to process 0, which needs to be +! received before the program can exit + + 20 if (rank .eq. 0) then + call MPI_RECV(message, 1, MPI_INTEGER, from, tag, MPI_COMM_WORLD, & + MPI_STATUS_IGNORE, ierr) + endif + +! All done + + call MPI_FINALIZE(ierr) +end program +