|
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 |
#define TARGET 0
|
|
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("Zero-byte op " 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, TARGET, 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("Zero-byte op " op_name_, err); \
|
|
Packit |
0848f5 |
} \
|
|
Packit |
0848f5 |
} \
|
|
Packit |
0848f5 |
err = MPI_Win_unlock(TARGET, 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, TARGET, 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("Zero-byte op " op_name_, err); \
|
|
Packit |
0848f5 |
} \
|
|
Packit |
0848f5 |
} \
|
|
Packit |
0848f5 |
err = MPI_Win_unlock(TARGET, 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 handling of zero-byte transfers";
|
|
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 |
MPI_Datatype derived_dtp;
|
|
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 |
MPI_Type_contiguous(2, MPI_INT, &derived_dtp);
|
|
Packit |
0848f5 |
MPI_Type_commit(&derived_dtp);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* The following loop is used to run through a series of communicators
|
|
Packit |
0848f5 |
* that are subsets of MPI_COMM_WORLD, of size 1 or greater. */
|
|
Packit |
0848f5 |
while (MTestGetIntracommGeneral(&comm, 1, 1)) {
|
|
Packit |
0848f5 |
int count = 0;
|
|
Packit |
0848f5 |
|
|
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, 2 * 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", MPI_Put(rmabuf, count, MPI_INT, TARGET, 0, count, MPI_INT, win);
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
TEST_FENCE_OP("Get", MPI_Get(rmabuf, count, MPI_INT, TARGET, 0, count, MPI_INT, win);
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_FENCE_OP("Accumulate",
|
|
Packit |
0848f5 |
MPI_Accumulate(rmabuf, count, MPI_INT, TARGET,
|
|
Packit |
0848f5 |
0, count, MPI_INT, MPI_SUM, win);
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_FENCE_OP("Accumulate_derived",
|
|
Packit |
0848f5 |
MPI_Accumulate(rmabuf, count, derived_dtp, TARGET,
|
|
Packit |
0848f5 |
0, count, derived_dtp, MPI_SUM, win);
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_FENCE_OP("Get accumulate",
|
|
Packit |
0848f5 |
MPI_Get_accumulate(rmabuf, count, MPI_INT, result,
|
|
Packit |
0848f5 |
count, MPI_INT, TARGET, 0, count, MPI_INT, MPI_SUM, win);
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
/* Note: It's not possible to generate a zero-byte FOP or CAS */
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/** TEST OPERATIONS USING PASSIVE TARGET SYNCHRONIZATION **/
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
TEST_PT_OP("Put", MPI_Put(rmabuf, count, MPI_INT, TARGET, 0, count, MPI_INT, win);
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_PT_OP("Get", MPI_Get(rmabuf, count, MPI_INT, TARGET, 0, count, MPI_INT, win);
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_PT_OP("Accumulate",
|
|
Packit |
0848f5 |
MPI_Accumulate(rmabuf, count, MPI_INT, TARGET, 0, count, MPI_INT, MPI_SUM, win);
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_PT_OP("Accumulate_derived",
|
|
Packit |
0848f5 |
MPI_Accumulate(rmabuf, count, derived_dtp, TARGET, 0,
|
|
Packit |
0848f5 |
count, derived_dtp, MPI_SUM, win);
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_PT_OP("Get accumulate",
|
|
Packit |
0848f5 |
MPI_Get_accumulate(rmabuf, count, MPI_INT, result, count,
|
|
Packit |
0848f5 |
MPI_INT, TARGET, 0, count, MPI_INT, MPI_SUM, win);
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Note: It's not possible to generate a zero-byte FOP or CAS */
|
|
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, count, MPI_INT, TARGET, 0, count, MPI_INT, win, &req;;
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_REQ_OP("Rget", req,
|
|
Packit |
0848f5 |
MPI_Rget(rmabuf, count, MPI_INT, TARGET, 0, count, MPI_INT, win, &req;;
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_REQ_OP("Raccumulate", req,
|
|
Packit |
0848f5 |
MPI_Raccumulate(rmabuf, count, MPI_INT, TARGET, 0,
|
|
Packit |
0848f5 |
count, MPI_INT, MPI_SUM, win, &req;;
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_REQ_OP("Raccumulate_derived", req,
|
|
Packit |
0848f5 |
MPI_Raccumulate(rmabuf, count, derived_dtp, TARGET, 0,
|
|
Packit |
0848f5 |
count, derived_dtp, MPI_SUM, win, &req;;
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
TEST_REQ_OP("Rget_accumulate", req,
|
|
Packit |
0848f5 |
MPI_Rget_accumulate(rmabuf, count, MPI_INT, result,
|
|
Packit |
0848f5 |
count, MPI_INT, TARGET, 0,
|
|
Packit |
0848f5 |
count, 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 |
MPI_Type_free(&derived_dtp);
|
|
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 |
}
|