5 #if defined(NEEDS_STDLIB_PROTOTYPES)
11 int main( int argc, char **argv )
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;
20 MPI_Init( &argc, &argv );
21 MPI_Comm_size( MPI_COMM_WORLD, &size );
22 MPI_Comm_rank( MPI_COMM_WORLD, &rank );
24 up_nbr = (rank + 1) % size;
25 down_nbr = (size + rank - 1) % size;
27 for (i=0; i<10; i++) {
29 sbuf2[i] = (double)(i+20);
31 MPI_Buffer_attach( userbuf, 40*sizeof(double) + 4 * MPI_BSEND_OVERHEAD );
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] );
38 MPI_Waitall( 4, r, statuses );
41 MPI_Request_free( &r[i] );
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] );
49 MPI_Waitall( 4, r, statuses );
52 MPI_Request_free( &r[i] );
61 fprintf( stderr, "Expected %d, rbuf1[%d] = %f\n", i, i,
64 if (rbuf2[i] != i+20) {
67 fprintf( stderr, "Expected %d, rbuf2[%d] = %f\n", i+20, i,
72 MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
74 if (toterr == 0) printf( "No errors\n" );
75 else printf( "Found %d errors\n", toterr );