Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Change include order for smpi tests/examples to avoid conflicts
[simgrid.git] / teshsuite / smpi / mpich3-test / coll / coll11.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *  (C) 2001 by Argonne National Laboratory.
4  *      See COPYRIGHT in top-level directory.
5  */
6 #include "mpi.h"
7 #include <stdio.h>
8 #include "mpitest.h"
9
10 void addem ( int *, int *, int *, MPI_Datatype * );
11 void assoc ( int *, int *, int *, MPI_Datatype * );
12
13 void addem(int *invec, int *inoutvec, int *len, MPI_Datatype *dtype)
14 {
15   int i;
16   for ( i=0; i<*len; i++ ) 
17     inoutvec[i] += invec[i];
18 }
19
20 #define BAD_ANSWER 100000
21
22 /*
23     The operation is inoutvec[i] = invec[i] op inoutvec[i] 
24     (see 4.9.4).  The order is important.
25
26     Note that the computation is in process rank (in the communicator)
27     order, independant of the root.
28  */
29 void assoc(int *invec, int *inoutvec, int *len, MPI_Datatype *dtype)
30 {
31   int i;
32   for ( i=0; i<*len; i++ )  {
33     if (inoutvec[i] <= invec[i] ) {
34       int rank;
35       MPI_Comm_rank( MPI_COMM_WORLD, &rank );
36       fprintf( stderr, "[%d] inout[0] = %d, in[0] = %d\n", 
37               rank, inoutvec[0], invec[0] );
38       inoutvec[i] = BAD_ANSWER;
39       }
40     else 
41       inoutvec[i] = invec[i];
42   }
43 }
44
45 int main( int argc, char **argv )
46 {
47     int              rank, size, i;
48     int              data;
49     int              errors=0;
50     int              result = -100;
51     int              correct_result;
52     MPI_Op           op_assoc, op_addem;
53
54     MTest_Init( &argc, &argv );
55     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
56     MPI_Comm_size( MPI_COMM_WORLD, &size );
57
58     data = rank;
59
60     correct_result = 0;
61     for (i=0;i<=rank;i++)
62       correct_result += i;
63
64     MPI_Scan ( &data, &result, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
65     if (result != correct_result) {
66         fprintf( stderr, "[%d] Error suming ints with scan\n", rank );
67         errors++;
68         }
69
70     MPI_Scan ( &data, &result, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
71     if (result != correct_result) {
72         fprintf( stderr, "[%d] Error summing ints with scan (2)\n", rank );
73         errors++;
74         }
75
76     data = rank;
77     result = -100;
78     MPI_Op_create( (MPI_User_function *)assoc, 0, &op_assoc );
79     MPI_Op_create( (MPI_User_function *)addem, 1, &op_addem );
80     MPI_Scan ( &data, &result, 1, MPI_INT, op_addem, MPI_COMM_WORLD );
81     if (result != correct_result) {
82         fprintf( stderr, "[%d] Error summing ints with scan (userop)\n", 
83                  rank );
84         errors++;
85         }
86
87     MPI_Scan ( &data, &result, 1, MPI_INT, op_addem, MPI_COMM_WORLD );
88     if (result != correct_result) {
89         fprintf( stderr, "[%d] Error summing ints with scan (userop2)\n", 
90                  rank );
91         errors++;
92         }
93     result = -100;
94     data = rank;
95     MPI_Scan ( &data, &result, 1, MPI_INT, op_assoc, MPI_COMM_WORLD );
96     if (result == BAD_ANSWER) {
97         fprintf( stderr, "[%d] Error scanning with non-commutative op\n",
98                  rank );
99         errors++;
100         }
101
102     MPI_Op_free( &op_assoc );
103     MPI_Op_free( &op_addem );
104
105     MTest_Finalize( errors );
106     MPI_Finalize();
107     return MTestReturnValue( errors );
108 }