2 * Test for null proc handling with blocking routines
9 #if defined(NEEDS_STDLIB_PROTOTYPES)
13 int main( int argc, char *argv[] )
17 int rank, right, left;
18 MPI_Status st[2], sts[2];
20 int count, errcnt = 0;
23 MPI_Init(&argc, &argv);
24 MPI_Comm_size(MPI_COMM_WORLD, &nproc);
25 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
27 /* set up processor chain (Apps should use Cart_create/shift) */
28 left = (rank == 0) ? MPI_PROC_NULL : rank - 1;
29 right = (rank == nproc - 1) ? MPI_PROC_NULL : rank + 1;
31 /* initialize local matrix */
32 /* globally: a[i] = i, i = 1 .. 2*nproc */
33 /* locally : a[i] = 2*rank+i, i=1,2 */
39 /* start all receives and sends */
40 MPI_Isend(&a[1], 1, MPI_INT, left, 0, MPI_COMM_WORLD, &req[0]);
41 MPI_Isend(&a[2], 1, MPI_INT, right, 1, MPI_COMM_WORLD, &req[1]);
42 st[0].MPI_SOURCE = nproc;
44 st[1].MPI_SOURCE = nproc;
46 MPI_Recv(&a[0], 1, MPI_INT, left, 1, MPI_COMM_WORLD, &st[0]);
47 MPI_Recv(&a[3], 1, MPI_INT, right, 0, MPI_COMM_WORLD, &st[1]);
48 MPI_Waitall( 2, req, sts );
50 /* Test the end points */
51 if (left == MPI_PROC_NULL) {
52 if (st[0].MPI_TAG != MPI_ANY_TAG ||
53 st[0].MPI_SOURCE != MPI_PROC_NULL) {
55 fprintf( stderr, "Incorrect null status for left\n" );
56 if (st[0].MPI_SOURCE != MPI_PROC_NULL) {
57 fprintf( stderr, "Source returned was %d but should be %d\n",
58 st[0].MPI_SOURCE, MPI_PROC_NULL );
61 MPI_Get_count( &st[0], MPI_INT, &count );
64 fprintf( stderr, "Incorrect null status for left (count)\n" );
65 fprintf( stderr, "Count was %d but should be 0\n", count );
68 else if (right == MPI_PROC_NULL) {
69 if (st[1].MPI_TAG != MPI_ANY_TAG ||
70 st[1].MPI_SOURCE != MPI_PROC_NULL) {
72 fprintf( stderr, "Incorrect null status for right\n" );
73 if (st[1].MPI_SOURCE != MPI_PROC_NULL) {
74 fprintf( stderr, "Source returned was %d but should be %d\n",
75 st[1].MPI_SOURCE, MPI_PROC_NULL );
78 MPI_Get_count( &st[1], MPI_INT, &count );
81 fprintf( stderr, "Incorrect null status for right (count)\n" );
82 fprintf( stderr, "Count was %d but should be 0\n", count );
87 if (left == MPI_PROC_NULL) {
89 fprintf( stderr, "Expected -1, found %d in left partner\n", a[0] );
94 if (a[0] != 2 * left + 2) {
95 fprintf( stderr, "Expected %d, found %d in left partner\n",
101 if (right == MPI_PROC_NULL) {
103 fprintf( stderr, "Expected -1, found %d in right partner\n", a[3] );
108 if (a[3] != 2 * right + 1) {
109 fprintf( stderr, "Expected %d, found %d in right partner\n",
110 2 * right + 1, a[3] );
117 MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
120 printf( "Found %d errors in the run \n", errcnt );
123 printf( "No errors in handling MPI_PROC_NULL\n" );