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); */