Blame test/mpi/coll/coll11.c

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