Blame test/mpi/coll/coll10.c

Packit 0848f5
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit 0848f5
/*
Packit 0848f5
 *  (C) 2001 by Argonne National Laboratory.
Packit 0848f5
 *      See COPYRIGHT in top-level directory.
Packit 0848f5
 */
Packit 0848f5
#include "mpi.h"
Packit 0848f5
#include <stdio.h>
Packit 0848f5
#include "mpitest.h"
Packit 0848f5
Packit 0848f5
#define BAD_ANSWER 100000
Packit 0848f5
Packit 0848f5
int assoc(int *, int *, int *, MPI_Datatype *);
Packit 0848f5
Packit 0848f5
/*
Packit 0848f5
    The operation is inoutvec[i] = invec[i] op inoutvec[i]
Packit 0848f5
    (see 4.9.4).  The order is important.
Packit 0848f5
Packit 0848f5
    Note that the computation is in process rank (in the communicator)
Packit 0848f5
    order, independant of the root.
Packit 0848f5
 */
Packit 0848f5
int assoc(int *invec, int *inoutvec, int *len, MPI_Datatype * dtype)
Packit 0848f5
{
Packit 0848f5
    int i;
Packit 0848f5
    for (i = 0; i < *len; i++) {
Packit 0848f5
        if (inoutvec[i] <= invec[i]) {
Packit 0848f5
            int rank;
Packit 0848f5
            MPI_Comm_rank(MPI_COMM_WORLD, &rank;;
Packit 0848f5
            fprintf(stderr, "[%d] inout[0] = %d, in[0] = %d\n", rank, inoutvec[0], invec[0]);
Packit 0848f5
            inoutvec[i] = BAD_ANSWER;
Packit 0848f5
        }
Packit 0848f5
        else
Packit 0848f5
            inoutvec[i] = invec[i];
Packit 0848f5
    }
Packit 0848f5
    return (1);
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    int rank, size;
Packit 0848f5
    int data;
Packit 0848f5
    int errors = 0;
Packit 0848f5
    int result = -100;
Packit 0848f5
    MPI_Op op;
Packit 0848f5
Packit 0848f5
    MTest_Init(&argc, &argv);
Packit 0848f5
    MPI_Comm_rank(MPI_COMM_WORLD, &rank;;
Packit 0848f5
    MPI_Comm_size(MPI_COMM_WORLD, &size);
Packit 0848f5
Packit 0848f5
    data = rank;
Packit 0848f5
Packit 0848f5
    MPI_Op_create((MPI_User_function *) assoc, 0, &op);
Packit 0848f5
    MPI_Reduce(&data, &result, 1, MPI_INT, op, size - 1, MPI_COMM_WORLD);
Packit 0848f5
    MPI_Bcast(&result, 1, MPI_INT, size - 1, MPI_COMM_WORLD);
Packit 0848f5
    MPI_Op_free(&op);
Packit 0848f5
    if (result == BAD_ANSWER)
Packit 0848f5
        errors++;
Packit 0848f5
Packit 0848f5
    MTest_Finalize(errors);
Packit 0848f5
    MPI_Finalize();
Packit 0848f5
    return MTestReturnValue(errors);
Packit 0848f5
}