2 * This file shows a typical use of MPI_Cancel to free Persistent Recv's that
3 * are not wanted. We check for both successful and unsuccessful
7 /* On 10/27/99, a test for MPI_Waitsome/MPI_Testsome was added */
12 #if defined(NEEDS_STDLIB_PROTOTYPES)
16 int main( int argc, char **argv )
21 int partner, buf[10], flag, idx, index;
24 MPI_Init( &argc, &argv );
26 MPI_Comm_size( MPI_COMM_WORLD, &size );
27 MPI_Comm_rank( MPI_COMM_WORLD, &rank );
30 printf( "Cancel test requires at least 2 processes\n" );
31 MPI_Abort( MPI_COMM_WORLD, 1 );
35 * Here is the test. First, we ensure an unsatisfied Irecv:
36 * process 0 process size-1
41 * Next, we confirm receipt before canceling
48 /* Cancel succeeds for wait/waitall */
49 MPI_Recv_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
50 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
51 MPI_BOTTOM, 0, MPI_INT, partner, 1,
52 MPI_COMM_WORLD, &status );
55 MPI_Wait( &r1, &status );
56 MPI_Test_cancelled( &status, &flag );
57 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
58 MPI_BOTTOM, 0, MPI_INT, partner, 1,
59 MPI_COMM_WORLD, &status );
62 printf( "Cancel of a receive failed where it should succeed (Wait).\n" );
65 MPI_Request_free( &r1 );
67 /* Cancel fails for test/testall */
69 MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
71 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
72 MPI_BOTTOM, 0, MPI_INT, partner, 1,
73 MPI_COMM_WORLD, &status );
75 MPI_Test( &r1, &flag, &status );
76 MPI_Test_cancelled( &status, &flag );
79 printf( "Cancel of a receive succeeded where it shouldn't (Test).\n" );
81 printf( "Receive buffer changed even though cancel suceeded! (Test).\n" );
84 MPI_Request_free( &r1 );
86 /* Cancel succeeds for waitany */
87 MPI_Recv_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
88 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
89 MPI_BOTTOM, 0, MPI_INT, partner, 1,
90 MPI_COMM_WORLD, &status );
93 MPI_Waitany( 1, &r1, &idx, &status );
94 MPI_Test_cancelled( &status, &flag );
95 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
96 MPI_BOTTOM, 0, MPI_INT, partner, 1,
97 MPI_COMM_WORLD, &status );
100 printf( "Cancel of a receive failed where it should succeed (Waitany).\n" );
102 MPI_Request_free( &r1 );
104 /* Cancel fails for testany */
106 MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
108 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
109 MPI_BOTTOM, 0, MPI_INT, partner, 1,
110 MPI_COMM_WORLD, &status );
112 MPI_Testany( 1, &r1, &idx, &flag, &status );
113 MPI_Test_cancelled( &status, &flag );
116 printf( "Cancel of a receive succeeded where it shouldn't (Testany).\n" );
118 printf( "Receive buffer changed even though cancel suceeded! (Test).\n" );
121 MPI_Request_free( &r1 );
123 /* Cancel succeeds for waitsome */
124 MPI_Recv_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
125 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
126 MPI_BOTTOM, 0, MPI_INT, partner, 1,
127 MPI_COMM_WORLD, &status );
130 MPI_Waitsome( 1, &r1, &idx, &index, &status );
131 MPI_Test_cancelled( &status, &flag );
132 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
133 MPI_BOTTOM, 0, MPI_INT, partner, 1,
134 MPI_COMM_WORLD, &status );
137 printf( "Cancel of a receive failed where it should succeed (Waitsome).\n" );
139 MPI_Request_free( &r1 );
141 /* Cancel fails for testsome*/
143 MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
145 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
146 MPI_BOTTOM, 0, MPI_INT, partner, 1,
147 MPI_COMM_WORLD, &status );
149 MPI_Testsome( 1, &r1, &idx, &index, &status );
150 MPI_Test_cancelled( &status, &flag );
153 printf( "Cancel of a receive succeeded where it shouldn't (Testsome).\n" );
155 printf( "Receive buffer changed even though cancel suceeded! (Testsome).\n" );
158 MPI_Request_free( &r1 );
161 printf( "Test failed with %d errors.\n", err );
164 printf( " No Errors\n" );
168 else if (rank == size - 1) {
170 /* Cancel succeeds for wait/waitall */
171 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
172 MPI_BOTTOM, 0, MPI_INT, partner, 1,
173 MPI_COMM_WORLD, &status );
174 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
175 MPI_BOTTOM, 0, MPI_INT, partner, 1,
176 MPI_COMM_WORLD, &status );
177 /* Cancel fails for test/testall */
179 MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD );
180 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
181 MPI_BOTTOM, 0, MPI_INT, partner, 1,
182 MPI_COMM_WORLD, &status );
184 /* Cancel succeeds for waitany */
185 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
186 MPI_BOTTOM, 0, MPI_INT, partner, 1,
187 MPI_COMM_WORLD, &status );
188 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
189 MPI_BOTTOM, 0, MPI_INT, partner, 1,
190 MPI_COMM_WORLD, &status );
191 /* Cancel fails for testany */
192 MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD );
193 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
194 MPI_BOTTOM, 0, MPI_INT, partner, 1,
195 MPI_COMM_WORLD, &status );
197 /* Cancel succeeds for waitsome */
198 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
199 MPI_BOTTOM, 0, MPI_INT, partner, 1,
200 MPI_COMM_WORLD, &status );
201 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
202 MPI_BOTTOM, 0, MPI_INT, partner, 1,
203 MPI_COMM_WORLD, &status );
204 /* Cancel fails for waitsome */
205 MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD );
206 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
207 MPI_BOTTOM, 0, MPI_INT, partner, 1,
208 MPI_COMM_WORLD, &status );
211 Next test - check that a cancel for a request receive from
212 MPI_PROC_NULL succeeds (there is some suspicion that some
213 systems can't handle this - also, MPI_REQUEST_NULL
215 /* A null request is an error. (null objects are errors unless otherwise
217 r1 = MPI_REQUEST_NULL;
220 MPI_Recv_init( buf, 10, MPI_INT, MPI_PROC_NULL, 0, MPI_COMM_WORLD, &r1 );
223 MPI_Request_free( &r1 ); /* Must complete cancel. We know that it
224 won't complete, so we don't need to do