Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add fortran tests from mpich-tests, enforce completion of mpich-tests suite with...
[simgrid.git] / teshsuite / smpi / mpich-test / coll / coll13.c
1 #include "mpi.h"
2 #include "test.h"
3
4 /* 
5 From: hook@nas.nasa.gov (Edward C. Hook)
6  */
7
8 #include <stdlib.h>
9 #include <stdio.h>
10
11 #include <string.h>
12 #include <errno.h>
13 #ifndef EXIT_SUCCESS
14 #define EXIT_SUCCESS 0
15 #define EXIT_FAILURE 1
16 #endif
17
18 int main( int argc, char *argv[] )
19 {
20     int rank, size;
21     int chunk = 4096;
22     int i;
23     int *sb;
24     int *rb;
25     int status, gstatus;
26
27     MPI_Init(&argc,&argv);
28     MPI_Comm_rank(MPI_COMM_WORLD,&rank);
29     MPI_Comm_size(MPI_COMM_WORLD,&size);
30
31     for ( i=1 ; i < argc ; ++i ) {
32         if ( argv[i][0] != '-' )
33             continue;
34         switch(argv[i][1]) {
35         case 'm':
36             chunk = atoi(argv[++i]);
37             break;
38         default:
39             fprintf(stderr,"Unrecognized argument %s\n",
40                     argv[i]);
41             MPI_Abort(MPI_COMM_WORLD,EXIT_FAILURE);
42         }
43     }
44
45     sb = (int *)malloc(size*chunk*sizeof(int));
46     if ( !sb ) {
47         perror( "can't allocate send buffer" );
48         MPI_Abort(MPI_COMM_WORLD,EXIT_FAILURE);
49     }
50     rb = (int *)malloc(size*chunk*sizeof(int));
51     if ( !rb ) {
52         perror( "can't allocate recv buffer");
53         free(sb);
54         MPI_Abort(MPI_COMM_WORLD,EXIT_FAILURE);
55     }
56     for ( i=0 ; i < size*chunk ; ++i ) {
57         sb[i] = rank + 1;
58         rb[i] = 0;
59     }
60
61     /* fputs("Before MPI_Alltoall\n",stdout); */
62
63     /* This should really send MPI_CHAR, but since sb and rb were allocated
64        as chunk*size*sizeof(int), the buffers are large enough */
65     status = MPI_Alltoall(sb,chunk,MPI_INT,rb,chunk,MPI_INT,
66                           MPI_COMM_WORLD);
67
68     /* fputs("Before MPI_Allreduce\n",stdout); */
69     MPI_Allreduce( &status, &gstatus, 1, MPI_INT, MPI_SUM, 
70                    MPI_COMM_WORLD );
71
72     /* fputs("After MPI_Allreduce\n",stdout); */
73     if (rank == 0) {
74         if (gstatus == 0) printf( " No Errors\n" );
75         else 
76             printf("all_to_all returned %d\n",gstatus);
77     }
78
79     free(sb);
80     free(rb);
81
82     MPI_Finalize();
83
84     return(EXIT_SUCCESS);
85 }
86