2 * This file shows a typical use of MPI_Cancel to free Persistent Send's that
3 * are not wanted. We check for both successful and unsuccessful
10 #if defined(NEEDS_STDLIB_PROTOTYPES)
14 int main( int argc, char **argv )
19 int partner, buf[10], flag, idx, index;
22 MPI_Init( &argc, &argv );
24 MPI_Comm_size( MPI_COMM_WORLD, &size );
25 MPI_Comm_rank( MPI_COMM_WORLD, &rank );
28 printf( "Cancel test requires at least 2 processes\n" );
29 MPI_Abort( MPI_COMM_WORLD, 1 );
33 * Here is the test. First, we ensure an unsatisfied Irecv:
34 * process 0 process size-1
39 * Next, we confirm receipt before canceling
46 /* Cancel succeeds for wait/waitall */
47 MPI_Send_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
48 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
49 MPI_BOTTOM, 0, MPI_INT, partner, 1,
50 MPI_COMM_WORLD, &status );
53 MPI_Wait( &r1, &status );
54 MPI_Test_cancelled( &status, &flag );
55 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
56 MPI_BOTTOM, 0, MPI_INT, partner, 1,
57 MPI_COMM_WORLD, &status );
60 printf( "Cancel of a send failed where it should succeed (Wait).\n" );
62 MPI_Request_free( &r1 );
64 /* Cancel fails for test/testall */
66 MPI_Send_init( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
68 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
69 MPI_BOTTOM, 0, MPI_INT, partner, 1,
70 MPI_COMM_WORLD, &status );
72 MPI_Test( &r1, &flag, &status );
73 MPI_Test_cancelled( &status, &flag );
76 printf( "Cancel of a send succeeded where it shouldn't (Test).\n" );
78 MPI_Request_free( &r1 );
80 /* Cancel succeeds for waitany */
81 MPI_Send_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
82 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
83 MPI_BOTTOM, 0, MPI_INT, partner, 1,
84 MPI_COMM_WORLD, &status );
87 MPI_Waitany( 1, &r1, &idx, &status );
88 MPI_Test_cancelled( &status, &flag );
89 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
90 MPI_BOTTOM, 0, MPI_INT, partner, 1,
91 MPI_COMM_WORLD, &status );
94 printf( "Cancel of a send failed where it should succeed (Waitany).\n" );
96 MPI_Request_free( &r1 );
98 /* Cancel fails for testany */
100 MPI_Send_init( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
102 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
103 MPI_BOTTOM, 0, MPI_INT, partner, 1,
104 MPI_COMM_WORLD, &status );
106 MPI_Testany( 1, &r1, &idx, &flag, &status );
107 MPI_Test_cancelled( &status, &flag );
110 printf( "Cancel of a send succeeded where it shouldn't (Testany).\n" );
112 MPI_Request_free( &r1 );
114 /* Cancel succeeds for waitsome */
115 MPI_Send_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
116 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
117 MPI_BOTTOM, 0, MPI_INT, partner, 1,
118 MPI_COMM_WORLD, &status );
121 MPI_Waitsome( 1, &r1, &idx, &index, &status );
122 MPI_Test_cancelled( &status, &flag );
123 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
124 MPI_BOTTOM, 0, MPI_INT, partner, 1,
125 MPI_COMM_WORLD, &status );
128 printf( "Cancel of a send failed where it should succeed (Waitsome).\n" );
130 MPI_Request_free( &r1 );
132 /* Cancel fails for testsome*/
134 MPI_Send_init( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
136 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
137 MPI_BOTTOM, 0, MPI_INT, partner, 1,
138 MPI_COMM_WORLD, &status );
140 MPI_Testsome( 1, &r1, &idx, &index, &status );
141 MPI_Test_cancelled( &status, &flag );
144 printf( "Cancel of a send succeeded where it shouldn't (Testsome).\n" );
146 MPI_Request_free( &r1 );
149 printf( "Test failed with %d errors.\n", err );
152 printf( " No Errors\n" );
155 else if (rank == size - 1) {
157 /* Cancel succeeds for wait/waitall */
158 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
159 MPI_BOTTOM, 0, MPI_INT, partner, 1,
160 MPI_COMM_WORLD, &status );
161 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
162 MPI_BOTTOM, 0, MPI_INT, partner, 1,
163 MPI_COMM_WORLD, &status );
165 /* Cancel fails for test/testall */
167 MPI_Recv( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &status );
168 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
169 MPI_BOTTOM, 0, MPI_INT, partner, 1,
170 MPI_COMM_WORLD, &status );
173 printf( "Receive buffer did not change even though cancel should not have suceeded! (Test).\n" );
176 /* Cancel succeeds for waitany */
177 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
178 MPI_BOTTOM, 0, MPI_INT, partner, 1,
179 MPI_COMM_WORLD, &status );
180 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
181 MPI_BOTTOM, 0, MPI_INT, partner, 1,
182 MPI_COMM_WORLD, &status );
183 /* Cancel fails for testany */
185 MPI_Recv( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &status );
186 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
187 MPI_BOTTOM, 0, MPI_INT, partner, 1,
188 MPI_COMM_WORLD, &status );
190 printf( "Receive buffer did not change even though cancel should not have suceeded! (Testany).\n" );
193 /* Cancel succeeds for waitsome */
194 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
195 MPI_BOTTOM, 0, MPI_INT, partner, 1,
196 MPI_COMM_WORLD, &status );
197 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
198 MPI_BOTTOM, 0, MPI_INT, partner, 1,
199 MPI_COMM_WORLD, &status );
200 /* Cancel fails for testsome */
202 MPI_Recv( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &status );
203 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
204 MPI_BOTTOM, 0, MPI_INT, partner, 1,
205 MPI_COMM_WORLD, &status );
208 printf( "Receive buffer did not change even though cancel should not have suceeded! (Test).\n" );