2 * Program to test that the "no overtaking messages" semantics
3 * of point to point communications in MPI is satisfied,
4 * for a simple send/irecv operation.
6 * Derived from a program written by
9 * patrick@CS.MsState.Edu
21 /* Which tests to perform (not yet implemented) */
22 /* static int Do_Buffer = 1; */
23 /* static int Do_Standard = 1; */
25 /* Prototypes for picky compilers */
26 void Generate_Data ( double *, int );
27 void Normal_Test_Send ( double *, int );
28 void Async_Test_Recv ( double *, int );
29 int Check_Data ( double *, int );
30 void Clear_Buffer ( double *, int );
32 void Generate_Data(buffer, buff_size)
38 for (i = 0; i < buff_size; i++)
39 buffer[i] = (double)i+1;
43 void Normal_Test_Send(buffer, buff_size)
49 for (j = 0; j < 2; j++) {
50 /* send a long message */
51 MPI_Send(buffer, (buff_size/2 - NSHORT), MPI_DOUBLE, dest, 2000,
53 buffer += buff_size/2 - NSHORT;
54 /* Followed by NSHORT short ones */
55 for (i = 0; i < NSHORT; i++)
56 MPI_Send(buffer++, 1, MPI_DOUBLE, dest, 2000, MPI_COMM_WORLD);
60 void Async_Test_Recv(buffer, buff_size)
68 for (j = 0; j < 2; j++) {
69 /* Receive a long message */
70 MPI_Irecv(buffer, (buff_size/2 - NSHORT), MPI_DOUBLE, src,
71 2000, MPI_COMM_WORLD, &(Hand[req++]));
72 buffer += buff_size/2 - NSHORT;
73 /* Followed by NSHORT short ones */
74 for (i = 0; i < NSHORT; i++)
75 MPI_Irecv(buffer++, 1, MPI_DOUBLE, src, 2000,
76 MPI_COMM_WORLD, &(Hand[req++]));
78 MPI_Waitall(req, Hand, Stat);
81 int Check_Data(buffer, buff_size)
88 for (i = 0; i < buff_size; i++)
89 if (buffer[i] != (i + 1)) {
91 fprintf( stderr, "Value at %d is %f, should be %f\n", i,
92 buffer[i], (double)(i+1) );
94 if (err > 10) return 1;
99 void Clear_Buffer(buffer, buff_size)
104 for (i = 0; i < buff_size; i++)
109 int main( int argc, char **argv)
111 int rank; /* My Rank (0 or 1) */
113 char *Current_Test = NULL;
115 MPI_Init(&argc, &argv);
116 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
119 Generate_Data(buffer, SIZE);
120 Normal_Test_Send(buffer, SIZE);
124 } else if (rank == dest) {
125 Test_Init("irecvtest", rank);
127 Clear_Buffer(buffer, SIZE);
128 Current_Test = (char*)"Overtaking Test (Normal Send -> Async Receive)";
129 Async_Test_Recv(buffer, SIZE);
130 if (Check_Data(buffer, SIZE))
131 Test_Failed(Current_Test);
133 Test_Passed(Current_Test);
138 int rval = Summarize_Test_Results(); /* Returns number of tests;
144 fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
145 MPI_Abort( MPI_COMM_WORLD, 1 );