4 #define BAD_ANSWER 100000
6 int assoc ( int *, int *, int *, MPI_Datatype * );
9 The operation is inoutvec[i] = invec[i] op inoutvec[i]
10 (see 4.9.4). The order is important.
12 Note that the computation is in process rank (in the communicator)
13 order, independant of the root.
15 int assoc(invec, inoutvec, len, dtype)
16 int *invec, *inoutvec, *len;
20 for ( i=0; i<*len; i++ ) {
21 if (inoutvec[i] <= invec[i] ) {
23 MPI_Comm_rank( MPI_COMM_WORLD, &rank );
24 fprintf( stderr, "[%d] inout[0] = %d, in[0] = %d\n",
25 rank, inoutvec[0], invec[0] );
26 inoutvec[i] = BAD_ANSWER;
29 inoutvec[i] = invec[i];
34 int main( int argc, char **argv )
42 MPI_Init( &argc, &argv );
43 MPI_Comm_rank( MPI_COMM_WORLD, &rank );
44 MPI_Comm_size( MPI_COMM_WORLD, &size );
48 MPI_Op_create( (MPI_User_function*)assoc, 0, &op );
49 MPI_Reduce ( &data, &result, 1, MPI_INT, op, size-1, MPI_COMM_WORLD );
50 MPI_Bcast ( &result, 1, MPI_INT, size-1, MPI_COMM_WORLD );
52 if (result == BAD_ANSWER) errors++;
55 printf( "[%d] done with ERRORS(%d)!\n", rank, errors );