Blame test/mpi/coll/scantst.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
void addem(int *, int *, int *, MPI_Datatype *);
Packit 0848f5
void assoc(int *, int *, int *, MPI_Datatype *);
Packit 0848f5
Packit 0848f5
void addem(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
        inoutvec[i] += invec[i];
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
#define BAD_ANSWER 100000
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
void 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
}
Packit 0848f5
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    int rank, size, i;
Packit 0848f5
    int data;
Packit 0848f5
    int errors = 0;
Packit 0848f5
    int result = -100;
Packit 0848f5
    int correct_result;
Packit 0848f5
    MPI_Op op_assoc, op_addem;
Packit 0848f5
    MPI_Comm comm = MPI_COMM_WORLD;
Packit 0848f5
Packit 0848f5
    MPI_Init(&argc, &argv);
Packit 0848f5
    MPI_Op_create((MPI_User_function *) assoc, 0, &op_assoc);
Packit 0848f5
    MPI_Op_create((MPI_User_function *) addem, 1, &op_addem);
Packit 0848f5
Packit 0848f5
    /* Run this for a variety of communicator sizes */
Packit 0848f5
Packit 0848f5
    MPI_Comm_rank(comm, &rank;;
Packit 0848f5
    MPI_Comm_size(comm, &size);
Packit 0848f5
Packit 0848f5
    data = rank;
Packit 0848f5
Packit 0848f5
    correct_result = 0;
Packit 0848f5
    for (i = 0; i <= rank; i++)
Packit 0848f5
        correct_result += i;
Packit 0848f5
Packit 0848f5
    MPI_Scan(&data, &result, 1, MPI_INT, MPI_SUM, comm);
Packit 0848f5
    if (result != correct_result) {
Packit 0848f5
        fprintf(stderr, "[%d] Error suming ints with scan\n", rank);
Packit 0848f5
        errors++;
Packit 0848f5
    }
Packit 0848f5
Packit 0848f5
    MPI_Scan(&data, &result, 1, MPI_INT, MPI_SUM, comm);
Packit 0848f5
    if (result != correct_result) {
Packit 0848f5
        fprintf(stderr, "[%d] Error summing ints with scan (2)\n", rank);
Packit 0848f5
        errors++;
Packit 0848f5
    }
Packit 0848f5
Packit 0848f5
    data = rank;
Packit 0848f5
    result = -100;
Packit 0848f5
    MPI_Scan(&data, &result, 1, MPI_INT, op_addem, comm);
Packit 0848f5
    if (result != correct_result) {
Packit 0848f5
        fprintf(stderr, "[%d] Error summing ints with scan (userop)\n", rank);
Packit 0848f5
        errors++;
Packit 0848f5
    }
Packit 0848f5
Packit 0848f5
    MPI_Scan(&data, &result, 1, MPI_INT, op_addem, comm);
Packit 0848f5
    if (result != correct_result) {
Packit 0848f5
        fprintf(stderr, "[%d] Error summing ints with scan (userop2)\n", rank);
Packit 0848f5
        errors++;
Packit 0848f5
    }
Packit 0848f5
    result = -100;
Packit 0848f5
    data = rank;
Packit 0848f5
    MPI_Scan(&data, &result, 1, MPI_INT, op_assoc, comm);
Packit 0848f5
    if (result == BAD_ANSWER) {
Packit 0848f5
        fprintf(stderr, "[%d] Error scanning with non-commutative op\n", rank);
Packit 0848f5
        errors++;
Packit 0848f5
    }
Packit 0848f5
Packit 0848f5
    MPI_Op_free(&op_assoc);
Packit 0848f5
    MPI_Op_free(&op_addem);
Packit 0848f5
Packit 0848f5
    MPI_Finalize();
Packit 0848f5
    if (errors)
Packit 0848f5
        printf("[%d] done with ERRORS(%d)!\n", rank, errors);
Packit 0848f5
    else {
Packit 0848f5
        if (rank == 0)
Packit 0848f5
            printf(" No Errors\n");
Packit 0848f5
    }
Packit 0848f5
Packit 0848f5
    return errors;
Packit 0848f5
}