Blame test/mpi/rma/rmanull.c

Packit 0848f5
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit 0848f5
/*
Packit 0848f5
 *
Packit 0848f5
 *  (C) 2010 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 <stdlib.h>
Packit 0848f5
#include "mpitest.h"
Packit 0848f5
Packit 0848f5
/* Test the given operation within a Fence epoch */
Packit 0848f5
#define TEST_FENCE_OP(op_name_, fcn_call_)                              \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        err = fcn_call_                                                 \
Packit 0848f5
        if (err) {                                                      \
Packit 0848f5
            errs++;                                                     \
Packit 0848f5
            if (errs < 10) {                                            \
Packit 0848f5
                MTestPrintErrorMsg("PROC_NULL to " op_name_, err);    \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
        err = MPI_Win_fence(0, win);                                  \
Packit 0848f5
        if (err) {                                                      \
Packit 0848f5
            errs++;                                                     \
Packit 0848f5
            if (errs < 10) {                                            \
Packit 0848f5
                MTestPrintErrorMsg("Fence after " op_name_, err);     \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
Packit 0848f5
/* Test the given operation within a passive target epoch */
Packit 0848f5
#define TEST_PT_OP(op_name_, fcn_call_)                                 \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        err = MPI_Win_lock(MPI_LOCK_EXCLUSIVE, MPI_PROC_NULL, 0, win);  \
Packit 0848f5
        if (err) {                                                      \
Packit 0848f5
            errs++;                                                     \
Packit 0848f5
            if (errs < 10) {                                            \
Packit 0848f5
                MTestPrintErrorMsg("Lock before" op_name_, err);      \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
        err = fcn_call_                                                 \
Packit 0848f5
        if (err) {                                                      \
Packit 0848f5
            errs++;                                                     \
Packit 0848f5
            if (errs < 10) {                                            \
Packit 0848f5
                MTestPrintErrorMsg("PROC_NULL to " op_name_, err);    \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
        err = MPI_Win_unlock(MPI_PROC_NULL, win);                     \
Packit 0848f5
        if (err) {                                                      \
Packit 0848f5
            errs++;                                                     \
Packit 0848f5
            if (errs < 10) {                                            \
Packit 0848f5
                MTestPrintErrorMsg("Unlock after " op_name_, err);    \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
Packit 0848f5
/* Test the given request-based operation within a passive target epoch */
Packit 0848f5
#define TEST_REQ_OP(op_name_, req_, fcn_call_)                          \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        err = MPI_Win_lock(MPI_LOCK_EXCLUSIVE, MPI_PROC_NULL, 0, win);  \
Packit 0848f5
        if (err) {                                                      \
Packit 0848f5
            errs++;                                                     \
Packit 0848f5
            if (errs < 10) {                                            \
Packit 0848f5
                MTestPrintErrorMsg("Lock before" op_name_, err);      \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
        err = fcn_call_                                                 \
Packit 0848f5
        if (err) {                                                      \
Packit 0848f5
            errs++;                                                     \
Packit 0848f5
            if (errs < 10) {                                            \
Packit 0848f5
                MTestPrintErrorMsg("PROC_NULL to " op_name_, err);    \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
        err = MPI_Win_unlock(MPI_PROC_NULL, win);                     \
Packit 0848f5
        if (err) {                                                      \
Packit 0848f5
            errs++;                                                     \
Packit 0848f5
            if (errs < 10) {                                            \
Packit 0848f5
                MTestPrintErrorMsg("Unlock after " op_name_, err);    \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
        err = MPI_Wait(&req_, MPI_STATUS_IGNORE);                     \
Packit 0848f5
        if (err) {                                                      \
Packit 0848f5
            errs++;                                                     \
Packit 0848f5
            if (errs < 10) {                                            \
Packit 0848f5
                MTestPrintErrorMsg("Wait after " op_name_, err);      \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
/*
Packit 0848f5
static char MTEST_Descrip[] = "Test the MPI_PROC_NULL is a valid target";
Packit 0848f5
*/
Packit 0848f5
Packit 0848f5
int main(int argc, char *argv[])
Packit 0848f5
{
Packit 0848f5
    int errs = 0, err;
Packit 0848f5
    int rank, size;
Packit 0848f5
    int *buf, bufsize;
Packit 0848f5
    int *result;
Packit 0848f5
    int *rmabuf, rsize, rcount;
Packit 0848f5
    MPI_Comm comm;
Packit 0848f5
    MPI_Win win;
Packit 0848f5
    MPI_Request req;
Packit 0848f5
Packit 0848f5
    MTest_Init(&argc, &argv);
Packit 0848f5
Packit 0848f5
    bufsize = 256 * sizeof(int);
Packit 0848f5
    buf = (int *) malloc(bufsize);
Packit 0848f5
    if (!buf) {
Packit 0848f5
        fprintf(stderr, "Unable to allocated %d bytes\n", bufsize);
Packit 0848f5
        MPI_Abort(MPI_COMM_WORLD, 1);
Packit 0848f5
    }
Packit 0848f5
    result = (int *) malloc(bufsize);
Packit 0848f5
    if (!result) {
Packit 0848f5
        fprintf(stderr, "Unable to allocated %d bytes\n", bufsize);
Packit 0848f5
        MPI_Abort(MPI_COMM_WORLD, 1);
Packit 0848f5
    }
Packit 0848f5
    rcount = 16;
Packit 0848f5
    rsize = rcount * sizeof(int);
Packit 0848f5
    rmabuf = (int *) malloc(rsize);
Packit 0848f5
    if (!rmabuf) {
Packit 0848f5
        fprintf(stderr, "Unable to allocated %d bytes\n", rsize);
Packit 0848f5
        MPI_Abort(MPI_COMM_WORLD, 1);
Packit 0848f5
    }
Packit 0848f5
Packit 0848f5
    /* The following illustrates the use of the routines to
Packit 0848f5
     * run through a selection of communicators and datatypes.
Packit 0848f5
     * Use subsets of these for tests that do not involve combinations
Packit 0848f5
     * of communicators, datatypes, and counts of datatypes */
Packit 0848f5
    while (MTestGetIntracommGeneral(&comm, 1, 1)) {
Packit 0848f5
        if (comm == MPI_COMM_NULL)
Packit 0848f5
            continue;
Packit 0848f5
        /* Determine the sender and receiver */
Packit 0848f5
        MPI_Comm_rank(comm, &rank;;
Packit 0848f5
        MPI_Comm_size(comm, &size);
Packit 0848f5
Packit 0848f5
        MPI_Win_create(buf, bufsize, sizeof(int), MPI_INFO_NULL, comm, &win);
Packit 0848f5
        /* To improve reporting of problems about operations, we
Packit 0848f5
         * change the error handler to errors return */
Packit 0848f5
        MPI_Win_set_errhandler(win, MPI_ERRORS_RETURN);
Packit 0848f5
Packit 0848f5
        /** TEST OPERATIONS USING ACTIVE TARGET (FENCE) SYNCHRONIZATION **/
Packit 0848f5
        MPI_Win_fence(0, win);
Packit 0848f5
Packit 0848f5
        TEST_FENCE_OP("Put",
Packit 0848f5
                      MPI_Put(rmabuf, rcount, MPI_INT, MPI_PROC_NULL, 0, rcount, MPI_INT, win);
Packit 0848f5
);
Packit 0848f5
Packit 0848f5
        TEST_FENCE_OP("Get",
Packit 0848f5
                      MPI_Get(rmabuf, rcount, MPI_INT, MPI_PROC_NULL, 0, rcount, MPI_INT, win);
Packit 0848f5
);
Packit 0848f5
        TEST_FENCE_OP("Accumulate",
Packit 0848f5
                      MPI_Accumulate(rmabuf, rcount, MPI_INT, MPI_PROC_NULL,
Packit 0848f5
                                     0, rcount, MPI_INT, MPI_SUM, win);
Packit 0848f5
);
Packit 0848f5
        TEST_FENCE_OP("Get accumulate",
Packit 0848f5
                      MPI_Get_accumulate(rmabuf, rcount, MPI_INT, result,
Packit 0848f5
                                         rcount, MPI_INT, MPI_PROC_NULL, 0,
Packit 0848f5
                                         rcount, MPI_INT, MPI_SUM, win);
Packit 0848f5
);
Packit 0848f5
        TEST_FENCE_OP("Fetch and op",
Packit 0848f5
                      MPI_Fetch_and_op(rmabuf, result, MPI_INT, MPI_PROC_NULL, 0, MPI_SUM, win);
Packit 0848f5
);
Packit 0848f5
        TEST_FENCE_OP("Compare and swap",
Packit 0848f5
                      MPI_Compare_and_swap(rmabuf, &rank, result, MPI_INT, MPI_PROC_NULL, 0, win);
Packit 0848f5
);
Packit 0848f5
Packit 0848f5
        /** TEST OPERATIONS USING PASSIVE TARGET SYNCHRONIZATION **/
Packit 0848f5
Packit 0848f5
        TEST_PT_OP("Put", MPI_Put(rmabuf, rcount, MPI_INT, MPI_PROC_NULL, 0, rcount, MPI_INT, win);
Packit 0848f5
);
Packit 0848f5
        TEST_PT_OP("Get", MPI_Get(rmabuf, rcount, MPI_INT, MPI_PROC_NULL, 0, rcount, MPI_INT, win);
Packit 0848f5
);
Packit 0848f5
        TEST_PT_OP("Accumulate",
Packit 0848f5
                   MPI_Accumulate(rmabuf, rcount, MPI_INT, MPI_PROC_NULL, 0,
Packit 0848f5
                                  rcount, MPI_INT, MPI_SUM, win);
Packit 0848f5
);
Packit 0848f5
        TEST_PT_OP("Get accumulate",
Packit 0848f5
                   MPI_Get_accumulate(rmabuf, rcount, MPI_INT, result, rcount,
Packit 0848f5
                                      MPI_INT, MPI_PROC_NULL, 0, rcount, MPI_INT, MPI_SUM, win);
Packit 0848f5
);
Packit 0848f5
        TEST_PT_OP("Fetch and op",
Packit 0848f5
                   MPI_Fetch_and_op(rmabuf, result, MPI_INT, MPI_PROC_NULL, 0, MPI_SUM, win);
Packit 0848f5
);
Packit 0848f5
        TEST_PT_OP("Compare and swap",
Packit 0848f5
                   MPI_Compare_and_swap(rmabuf, &rank, result, MPI_INT, MPI_PROC_NULL, 0, win);
Packit 0848f5
);
Packit 0848f5
Packit 0848f5
        /** TEST REQUEST-BASED OPERATIONS (PASSIVE TARGET ONLY) **/
Packit 0848f5
Packit 0848f5
        TEST_REQ_OP("Rput", req,
Packit 0848f5
                    MPI_Rput(rmabuf, rcount, MPI_INT, MPI_PROC_NULL, 0, rcount, MPI_INT, win, &req;;
Packit 0848f5
);
Packit 0848f5
        TEST_REQ_OP("Rget", req,
Packit 0848f5
                    MPI_Rget(rmabuf, rcount, MPI_INT, MPI_PROC_NULL, 0, rcount, MPI_INT, win, &req;;
Packit 0848f5
);
Packit 0848f5
        TEST_REQ_OP("Raccumulate", req,
Packit 0848f5
                    MPI_Raccumulate(rmabuf, rcount, MPI_INT, MPI_PROC_NULL, 0,
Packit 0848f5
                                    rcount, MPI_INT, MPI_SUM, win, &req;;
Packit 0848f5
);
Packit 0848f5
        TEST_REQ_OP("Rget_accumulate", req,
Packit 0848f5
                    MPI_Rget_accumulate(rmabuf, rcount, MPI_INT, result,
Packit 0848f5
                                        rcount, MPI_INT, MPI_PROC_NULL, 0,
Packit 0848f5
                                        rcount, MPI_INT, MPI_SUM, win, &req;;
Packit 0848f5
);
Packit 0848f5
Packit 0848f5
        MPI_Win_free(&win);
Packit 0848f5
        MTestFreeComm(&comm);
Packit 0848f5
    }
Packit 0848f5
Packit 0848f5
    free(result);
Packit 0848f5
    free(buf);
Packit 0848f5
    free(rmabuf);
Packit 0848f5
    MTest_Finalize(errs);
Packit 0848f5
    MPI_Finalize();
Packit 0848f5
    return 0;
Packit 0848f5
}