/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2005 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#include <stdio.h>
#include "mpi.h"
/* This is a program to enable testing and demonstration of the debugger
interface, particularly in terms of showing message queues. To use
this, run with a few processes and attach with the debugger when the
program stops. You can change the variable "hold" to 0 to allow the
program to complete. */
int main(int argc, char *argv[])
{
int wsize, wrank;
int source, dest, i;
int buf1[10], buf2[10], buf3[10];
MPI_Request r[3];
volatile int hold = 1;
MPI_Comm dupcomm;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &wsize);
MPI_Comm_rank(MPI_COMM_WORLD, &wrank);
/* Set the source and dest in a ring */
source = (wrank + 1) % wsize;
dest = (wrank + wsize - 1) % wsize;
MPI_Comm_dup(MPI_COMM_WORLD, &dupcomm);
MPI_Comm_set_name(dupcomm, "Dup of comm world");
for (i = 0; i < 3; i++) {
MPI_Irecv(MPI_BOTTOM, 0, MPI_INT, source, i + 100, MPI_COMM_WORLD, &r[i]);
}
MPI_Send(buf2, 8, MPI_INT, dest, 1, MPI_COMM_WORLD);
MPI_Send(buf3, 4, MPI_INT, dest, 2, dupcomm);
while (hold);
MPI_Recv(buf1, 10, MPI_INT, source, 1, MPI_COMM_WORLD, &status);
MPI_Recv(buf1, 10, MPI_INT, source, 1, dupcomm, &status);
for (i = 0; i < 3; i++) {
MPI_Cancel(&r[i]);
}
MPI_Comm_free(&dupcomm);
MPI_Finalize();
return 0;
}