Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add mpich3 test suite, to replace older one.
[simgrid.git] / teshsuite / smpi / mpich-test / pt2pt / cancel2.c
1 /*
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 
4  * cancels
5  */
6
7 /* On 10/27/99, a test for MPI_Waitsome/MPI_Testsome was added */
8
9 #include "mpi.h"
10 #include <stdio.h>
11
12 #if defined(NEEDS_STDLIB_PROTOTYPES)
13 #include "protofix.h"
14 #endif
15
16 int main( int argc, char **argv )
17 {
18     MPI_Request r1;
19     int         size, rank;
20     int         err = 0;
21     int         partner, buf[10], flag, idx, index;
22     MPI_Status  status;
23
24     MPI_Init( &argc, &argv );
25
26     MPI_Comm_size( MPI_COMM_WORLD, &size );
27     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
28     
29     if (size < 2) {
30         printf( "Cancel test requires at least 2 processes\n" );
31         MPI_Abort( MPI_COMM_WORLD, 1 );
32     }
33
34     /* 
35      * Here is the test.  First, we ensure an unsatisfied Irecv:
36      *       process 0             process size-1
37      *       Sendrecv              Sendrecv
38      *       Irecv                    ----
39      *       Cancel                   ----
40      *       Sendrecv              Sendrecv
41      * Next, we confirm receipt before canceling
42      *       Irecv                 Send
43      *       Sendrecv              Sendrecv
44      *       Cancel
45      */
46     if (rank == 0) {
47         partner = size - 1;
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 );
53         MPI_Start( &r1 );
54         MPI_Cancel( &r1 );
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 );
60         if (!flag) {
61             err++; 
62             printf( "Cancel of a receive failed where it should succeed (Wait).\n" );
63         }
64
65         MPI_Request_free( &r1 );
66
67         /* Cancel fails for test/testall */
68         buf[0] = -1;
69         MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
70         MPI_Start( &r1 );
71         MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
72                       MPI_BOTTOM, 0, MPI_INT, partner, 1,
73                       MPI_COMM_WORLD, &status );
74         MPI_Cancel( &r1 );
75         MPI_Test( &r1, &flag, &status );
76         MPI_Test_cancelled( &status, &flag );
77         if (flag) {
78             err++;
79             printf( "Cancel of a receive succeeded where it shouldn't (Test).\n" );
80             if (buf[0] != -1) {
81                 printf( "Receive buffer changed even though cancel suceeded! (Test).\n" );
82             }
83         }
84         MPI_Request_free( &r1 );
85
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 );
91         MPI_Start( &r1 );
92         MPI_Cancel( &r1 );
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 );
98         if (!flag) {
99             err++;
100             printf( "Cancel of a receive failed where it should succeed (Waitany).\n" );
101         }
102         MPI_Request_free( &r1 );
103
104         /* Cancel fails for testany */
105         buf[0] = -1;
106         MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
107         MPI_Start( &r1 );
108         MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
109                       MPI_BOTTOM, 0, MPI_INT, partner, 1,
110                       MPI_COMM_WORLD, &status );
111         MPI_Cancel( &r1 );
112         MPI_Testany( 1, &r1, &idx, &flag, &status );
113         MPI_Test_cancelled( &status, &flag );
114         if (flag) {
115             err++;
116             printf( "Cancel of a receive succeeded where it shouldn't (Testany).\n" );
117             if (buf[0] != -1) {
118                 printf( "Receive buffer changed even though cancel suceeded! (Test).\n" );
119             }
120         }
121         MPI_Request_free( &r1 );
122
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 );
128         MPI_Start( &r1 );
129         MPI_Cancel( &r1 );
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 );
135         if (!flag) {
136             err++;
137             printf( "Cancel of a receive failed where it should succeed (Waitsome).\n" );
138         }
139         MPI_Request_free( &r1 );
140
141         /* Cancel fails for testsome*/
142         buf[0] = -1;
143         MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
144         MPI_Start( &r1 );
145         MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
146                       MPI_BOTTOM, 0, MPI_INT, partner, 1,
147                       MPI_COMM_WORLD, &status );
148         MPI_Cancel( &r1 );
149         MPI_Testsome( 1, &r1, &idx, &index, &status );
150         MPI_Test_cancelled( &status, &flag );
151         if (flag) {
152             err++;
153             printf( "Cancel of a receive succeeded where it shouldn't (Testsome).\n" );
154             if (buf[0] != -1) {
155                 printf( "Receive buffer changed even though cancel suceeded! (Testsome).\n" );
156             }
157         }
158         MPI_Request_free( &r1 );
159
160         if (err) {
161             printf( "Test failed with %d errors.\n", err );
162         }
163         else {
164             printf( " No Errors\n" );
165         }
166     }
167
168     else if (rank == size - 1) {
169         partner = 0;
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 */
178         buf[0] = 3;
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 );
183
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 );
196
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 );
209
210     /* 
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 
214      */
215     /* A null request is an error. (null objects are errors unless otherwise
216        allowed)
217     r1 = MPI_REQUEST_NULL;
218     MPI_Cancel( &r1 );
219     */
220         MPI_Recv_init( buf, 10, MPI_INT, MPI_PROC_NULL, 0, MPI_COMM_WORLD, &r1 );
221         MPI_Start( &r1 );
222         MPI_Cancel( &r1 );
223         MPI_Request_free( &r1 );    /* Must complete cancel.  We know that it 
224                                        won't complete, so we don't need to do
225                                        anything else */
226     }
227
228     MPI_Finalize();
229     return 0;
230 }