2 * Program to test that the "no overtaking messages" semantics
3 * of point to point communications in MPI is satisfied.
4 * A long message is sent using MPI_Send and received using MPI_Recv,
5 * followed by lots of short messages sent the same way.
6 * Then Send -> Irecv, Bsend -> Recv, Bsend -> Irecv,
7 * Isend -> Recv, and Isend -> Irecv are all tried in the
12 * patrick@CS.MsState.Edu
25 /* Which tests to perform (not yet implemented) */
26 /* static int Do_Buffer = 1; */
27 /* static int Do_Standard = 1; */
28 /* In order to quiet noisy C compilers, we provide ANSI-style prototypes
30 void Generate_Data ( double *, int );
31 void Normal_Test_Send ( double *, int );
32 void Normal_Test_Recv ( double *, int );
33 void Buffered_Test_Send ( double *, int );
34 /* void Buffered_Test_Recv ( double *, int ); */
35 void Async_Test_Send ( double *, int );
36 void Async_Test_Recv ( double *, int );
37 int Check_Data ( double *, int );
38 void Clear_Buffer ( double *, int );
41 void Generate_Data(buffer, buff_size)
47 for (i = 0; i < buff_size; i++)
48 buffer[i] = (double)i+1;
51 void Normal_Test_Send(buffer, buff_size)
57 for (j = 0; j < 2; j++) {
58 /* send a long message */
59 MPI_Send(buffer, (buff_size/2 - 10), MPI_DOUBLE, dest, 2000,
61 buffer += buff_size/2 - 10;
62 /* Followed by 10 short ones */
63 for (i = 0; i < 10; i++)
64 MPI_Send(buffer++, 1, MPI_DOUBLE, dest, 2000, MPI_COMM_WORLD);
68 void Normal_Test_Recv(buffer, buff_size)
75 for (j = 0; j < 2; j++) {
76 /* Receive a long message */
77 MPI_Recv(buffer, (buff_size/2 - 10), MPI_DOUBLE, src,
78 2000, MPI_COMM_WORLD, &Stat);
79 buffer += buff_size/2 - 10;
80 /* Followed by 10 short ones */
81 for (i = 0; i < 10; i++)
82 MPI_Recv(buffer++, 1, MPI_DOUBLE, src, 2000, MPI_COMM_WORLD, &Stat);
86 void Buffered_Test_Send(buffer, buff_size)
94 for (j = 0; j < 2; j++) {
95 /* send a long message */
96 MPI_Bsend(buffer, (buff_size/2 - 10), MPI_DOUBLE, dest, 2000,
98 buffer += buff_size/2 - 10;
99 /* Followed by 10 short ones */
100 for (i = 0; i < 10; i++)
101 MPI_Bsend(buffer++, 1, MPI_DOUBLE,
102 dest, 2000, MPI_COMM_WORLD);
103 /* Force this set of Bsends to complete */
104 MPI_Buffer_detach( &bbuffer, &size );
105 MPI_Buffer_attach( bbuffer, size );
109 void Async_Test_Send(buffer, buff_size)
115 MPI_Request Hand[22];
117 for (j = 0; j < 2; j++) {
118 /* send a long message */
119 MPI_Isend(buffer, (buff_size/2 - 10), MPI_DOUBLE,
120 dest, 2000, MPI_COMM_WORLD, &(Hand[req++]));
121 buffer += buff_size/2 - 10;
122 /* Followed by 10 short ones */
123 for (i = 0; i < 10; i++)
124 MPI_Isend(buffer++, 1, MPI_DOUBLE, dest, 2000,
125 MPI_COMM_WORLD, &(Hand[req++]));
127 MPI_Waitall(req, Hand, Stat);
130 void Async_Test_Recv(buffer, buff_size)
136 MPI_Request Hand[22];
138 for (j = 0; j < 2; j++) {
139 /* Receive a long message */
140 MPI_Irecv(buffer, (buff_size/2 - 10), MPI_DOUBLE, src,
141 2000, MPI_COMM_WORLD, &(Hand[req++]));
142 buffer += buff_size/2 - 10;
143 /* Followed by 10 short ones */
144 for (i = 0; i < 10; i++)
145 MPI_Irecv(buffer++, 1, MPI_DOUBLE, src, 2000,
146 MPI_COMM_WORLD, &(Hand[req++]));
148 MPI_Waitall(req, Hand, Stat);
151 int Check_Data(buffer, buff_size)
158 for (i = 0; i < buff_size; i++)
159 if (buffer[i] != (i + 1)) {
161 fprintf( stderr, "Value at %d is %f, should be %f\n", i,
162 buffer[i], (double)(i+1) );
163 if (err > 10) return 1;
168 void Clear_Buffer(buffer, buff_size)
173 for (i = 0; i < buff_size; i++)
178 int main( int argc, char **argv )
180 int rank; /* My Rank (0 or 1) */
181 double buffer[SIZE], *tmpbuffer, *tmpbuf;
183 char *Current_Test = NULL;
185 MPI_Init(&argc, &argv);
186 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
189 Generate_Data(buffer, SIZE);
190 Normal_Test_Send(buffer, SIZE);
191 Normal_Test_Send(buffer, SIZE);
192 #if !defined(SIMPLE_SENDS) && !defined(NO_BUFFERED_SENDS)
193 MPI_Pack_size( SIZE, MPI_DOUBLE, MPI_COMM_WORLD, &bsize );
194 tmpbuffer = (double *) malloc( bsize + MPI_BSEND_OVERHEAD );
196 fprintf( stderr, "Could not allocate bsend buffer of size %d\n",
198 MPI_Abort( MPI_COMM_WORLD, 1 );
200 MPI_Buffer_attach( tmpbuffer, bsize + MPI_BSEND_OVERHEAD );
201 Buffered_Test_Send(buffer, SIZE);
202 Buffered_Test_Send(buffer, SIZE);
203 MPI_Buffer_detach( &tmpbuf, &tsize );
205 #if !defined(SIMPLE_SENDS) && !defined(NO_ASYNC_SENDS)
206 Async_Test_Send(buffer, SIZE);
207 Async_Test_Send(buffer, SIZE);
211 } else if (rank == dest) {
212 Test_Init("overtake", rank);
214 Current_Test = (char*)"Overtaking Test (Normal Send -> Normal Recieve)";
215 Normal_Test_Recv(buffer, SIZE);
217 if (Check_Data(buffer, SIZE))
218 Test_Failed(Current_Test);
220 Test_Passed(Current_Test);
223 Clear_Buffer(buffer, SIZE);
224 Current_Test = (char*)"Overtaking Test (Normal Send -> Async Receive)";
225 Async_Test_Recv(buffer, SIZE);
226 if (Check_Data(buffer, SIZE))
227 Test_Failed(Current_Test);
229 Test_Passed(Current_Test);
231 #if !defined(SIMPLE_SENDS) && !defined(NO_BUFFERED_SENDS)
233 Current_Test = (char*)"Overtaking Test (Buffered Send -> Normal Recieve)";
234 Clear_Buffer(buffer, SIZE);
235 Normal_Test_Recv(buffer, SIZE);
237 if (Check_Data(buffer, SIZE))
238 Test_Failed(Current_Test);
240 Test_Passed(Current_Test);
243 Clear_Buffer(buffer, SIZE);
244 Current_Test = (char*)"Overtaking Test (Buffered Send -> Async Receive)";
245 Async_Test_Recv(buffer, SIZE);
246 if (Check_Data(buffer, SIZE))
247 Test_Failed(Current_Test);
249 Test_Passed(Current_Test);
252 #if !defined(SIMPLE_SENDS) && !defined(NO_ASYNC_SENDS)
254 Current_Test = (char*)"Overtaking Test (Async Send -> Normal Receive)";
255 Clear_Buffer(buffer, SIZE);
256 Normal_Test_Recv(buffer, SIZE);
257 if (Check_Data(buffer, SIZE))
258 Test_Failed(Current_Test);
260 Test_Passed(Current_Test);
263 Clear_Buffer(buffer, SIZE);
264 Current_Test = (char*)"Overtaking Test (Async Send -> Async Receive)";
265 Async_Test_Recv(buffer, SIZE);
266 if (Check_Data(buffer, SIZE))
267 Test_Failed(Current_Test);
269 Test_Passed(Current_Test);
274 int rval = Summarize_Test_Results(); /* Returns number of tests;
281 fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
282 MPI_Abort( MPI_COMM_WORLD, 1 );