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 / persist2.c
1 #include "mpi.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #if defined(NEEDS_STDLIB_PROTOTYPES)
6 #include "protofix.h"
7 #endif
8
9 /*
10  */
11 int main( int argc, char **argv )
12 {
13     MPI_Request r[4];
14     MPI_Status  statuses[4];
15     double sbuf1[10], sbuf2[10];
16     double rbuf1[10], rbuf2[10];
17     double userbuf[40+4*MPI_BSEND_OVERHEAD];
18     int size, rank, up_nbr, down_nbr, i, err, toterr;
19
20     MPI_Init( &argc, &argv );
21     MPI_Comm_size( MPI_COMM_WORLD, &size );
22     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
23
24     up_nbr = (rank + 1) % size;
25     down_nbr = (size + rank - 1) % size;
26
27     for (i=0; i<10; i++) {
28         sbuf1[i] = (double)i;
29         sbuf2[i] = (double)(i+20);
30     }
31     MPI_Buffer_attach( userbuf, 40*sizeof(double) + 4 * MPI_BSEND_OVERHEAD );
32
33     MPI_Recv_init( rbuf1, 10, MPI_DOUBLE, down_nbr, 0, MPI_COMM_WORLD, &r[0] );
34     MPI_Recv_init( rbuf2, 10, MPI_DOUBLE, up_nbr, 1, MPI_COMM_WORLD, &r[1] );
35     MPI_Bsend_init( sbuf1, 10, MPI_DOUBLE, up_nbr, 0, MPI_COMM_WORLD, &r[2] );
36     MPI_Bsend_init( sbuf2, 10, MPI_DOUBLE, down_nbr, 1, MPI_COMM_WORLD, &r[3] );
37     MPI_Startall( 4, r );
38     MPI_Waitall( 4, r, statuses );
39
40     for (i=0; i<4; i++) {
41         MPI_Request_free( &r[i] );
42         }
43
44     MPI_Recv_init( rbuf1, 10, MPI_DOUBLE, down_nbr, 0, MPI_COMM_WORLD, &r[0] );
45     MPI_Recv_init( rbuf2, 10, MPI_DOUBLE, up_nbr, 1, MPI_COMM_WORLD, &r[1] );
46     MPI_Bsend_init( sbuf1, 10, MPI_DOUBLE, up_nbr, 0, MPI_COMM_WORLD, &r[2] );
47     MPI_Bsend_init( sbuf2, 10, MPI_DOUBLE, down_nbr, 1, MPI_COMM_WORLD, &r[3] );
48     MPI_Startall( 4, r );
49     MPI_Waitall( 4, r, statuses );
50
51     for (i=0; i<4; i++) {
52         MPI_Request_free( &r[i] );
53         }
54
55     /* Check data */
56     err = 0;
57     for (i=0; i<10;i++) {
58         if (rbuf1[i] != i) {
59             err++;
60             if (err < 10) 
61                 fprintf( stderr, "Expected %d, rbuf1[%d] = %f\n", i, i, 
62                          rbuf1[i] );
63         }
64         if (rbuf2[i] != i+20) {
65             err++;
66             if (err < 10) 
67                 fprintf( stderr, "Expected %d, rbuf2[%d] = %f\n", i+20, i, 
68                          rbuf2[i] );
69         }
70     }
71
72     MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
73     if (rank == 0) {
74         if (toterr == 0) printf( "No errors\n" );
75         else             printf( "Found %d errors\n", toterr );
76     }
77
78     MPI_Finalize();
79     return 0;
80 }