1
/* -*- Mode: C; c-basic-offset:4 ; -*- */
2
/* This program comes from Bert Still, bert@h4p.llnl.gov
3
It caused problems for the T3D implementation.
10
#define MESSAGE_VALUE 6
11
#define MESSAGE_TYPE MPI_BYTE
12
#define MESSAGE_CTYPE char
13
static MESSAGE_CTYPE recv_msg[8];
14
static MESSAGE_CTYPE send_msg[8];
16
static MPI_Status recv_status;
17
static MPI_Status send_status[2];
18
static MPI_Request request[2];
19
static int complete[2];
21
/*------------------------------------------------------------------------*/
23
void fatal ( int,const char * );
29
printf("***FATAL** rank %d: %s\n", rank, msg);
30
MPI_Abort(MPI_COMM_WORLD, 1);
35
int main( int argc, char *argv[] )
40
if (MPI_Init(&argc, &argv)!=MPI_SUCCESS) fatal(-1, "MPI_Init failed");
42
if (MPI_Comm_size(MPI_COMM_WORLD, &size)!=MPI_SUCCESS)
43
fatal(-1, "MPI_Comm_size failed");
44
if (MPI_Comm_rank(MPI_COMM_WORLD, &rank)!=MPI_SUCCESS)
45
fatal(-1, "MPI_Comm_rank failed");
46
if (size!=2) fatal(rank, "issend2 test requires -np 2\n");
49
if (MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
50
&recv_status)!=MPI_SUCCESS)
51
fatal(rank, "MPI_Probe failed");
52
if (recv_status.MPI_SOURCE!=0 || recv_status.MPI_TAG!=MESSAGE_TAG)
53
fatal(rank, "message source or tag wrong");
54
if (MPI_Recv(recv_msg, 8, MESSAGE_TYPE,
55
recv_status.MPI_SOURCE, recv_status.MPI_TAG, MPI_COMM_WORLD,
56
&recv_status)!=MPI_SUCCESS)
57
fatal(rank, "MPI_Recv failed");
58
if (recv_msg[0] == MESSAGE_VALUE) {
59
if (verbose) printf( "test completed successfully\n" );
62
printf("test failed: rank %d: got %d but expected %d\n",
63
rank, recv_msg[0], MESSAGE_VALUE );
69
if (recv_msg[0]!=MESSAGE_VALUE)
70
fatal(rank, "received message doesn't match sent message");
75
send_msg[0]= MESSAGE_VALUE;
77
if (MPI_Issend(send_msg, 1, MESSAGE_TYPE, /*rank*/1, MESSAGE_TAG,
78
MPI_COMM_WORLD, request) != MPI_SUCCESS)
79
fatal(rank, "MPI_Issend failed");
80
if (MPI_Waitsome(1, request, &n_complete, complete,send_status) !=
82
fatal(rank, "MPI_Waitsome failed");
83
if (request[0]!=MPI_REQUEST_NULL || n_complete!=1 || complete[0]!=0)
84
fatal(rank, "Waitsome result is wrong");
87
MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
90
printf( " No Errors\n" );
93
printf (" Found %d errors\n", toterr );
96
/* printf("rank %d: about to finalize\n", rank); */
99
/* printf("rank %d: finalize completed\n", rank); */