1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
/* -*- c-file-style: "GNU" -*- */
/*
* Copyright (C) CNRS, INRIA, Université Bordeaux 1, Télécom SudParis
* See COPYING in top-level directory.
*/
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
int numtasks, rank;
int rank_dst, ping_side;
// Initialise MPI
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
if (numtasks != 2) {
printf("Need 2 processes\n");
MPI_Abort(MPI_COMM_WORLD, 1);
exit(1);
}
ping_side = !(rank & 1);
rank_dst = ping_side ? (rank | 1) : (rank & ~1);
if (ping_side) {
int x = 42, y;
MPI_Request send_request;
MPI_Request recv_request;
MPI_Send_init(&x, 1, MPI_INT, rank_dst, 1, MPI_COMM_WORLD, &send_request);
MPI_Start(&send_request);
MPI_Wait(&send_request, MPI_STATUS_IGNORE);
MPI_Start(&send_request);
MPI_Wait(&send_request, MPI_STATUS_IGNORE);
MPI_Recv_init(&y, 1, MPI_INT, rank_dst, 1, MPI_COMM_WORLD, &recv_request);
MPI_Start(&recv_request);
MPI_Wait(&recv_request, MPI_STATUS_IGNORE);
if (y == 42)
printf("success\n");
else
printf("failure\n");
MPI_Start(&recv_request);
MPI_Wait(&recv_request, MPI_STATUS_IGNORE);
if (y == 42)
printf("success\n");
else
printf("failure\n");
} else {
int x, y;
MPI_Recv(&x, 1, MPI_INT, rank_dst, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(&y, 1, MPI_INT, rank_dst, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Send(&y, 1, MPI_INT, rank_dst, 1, MPI_COMM_WORLD);
MPI_Send(&y, 1, MPI_INT, rank_dst, 1, MPI_COMM_WORLD);
if (x == 42)
printf("success\n");
else
printf("failure\n");
if (y == 42)
printf("success\n");
else
printf("failure\n");
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
exit(0);
}
|