|
Packit |
0848f5 |
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
|
|
Packit |
0848f5 |
/*
|
|
Packit |
0848f5 |
* (C) 2012 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 |
#include <assert.h>
|
|
Packit |
0848f5 |
#include <string.h>
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#define LAST_TEST 14
|
|
Packit |
0848f5 |
#define RMA_SIZE 2048
|
|
Packit |
0848f5 |
#define OFFSET_1 7
|
|
Packit |
0848f5 |
#define OFFSET_2 83
|
|
Packit |
0848f5 |
#define OFFSET_3 157
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#define PUT_VAL 0xdcba97
|
|
Packit |
0848f5 |
#define ACC_VAL 10771134
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/*
|
|
Packit |
0848f5 |
* Additional tests for lock contention. These are designed to exercise
|
|
Packit |
0848f5 |
* some of the optimizations within MPICH, but all are valid MPI programs.
|
|
Packit |
0848f5 |
* Tests structure includes
|
|
Packit |
0848f5 |
* lock local (must happen at this time since application can use load
|
|
Packit |
0848f5 |
* store after the lock)
|
|
Packit |
0848f5 |
* send message to partner
|
|
Packit |
0848f5 |
* receive message
|
|
Packit |
0848f5 |
* send ack
|
|
Packit |
0848f5 |
* receive ack
|
|
Packit |
0848f5 |
* Provide a delay so that
|
|
Packit |
0848f5 |
* the partner will see the
|
|
Packit |
0848f5 |
* conflict
|
|
Packit |
0848f5 |
* partner executes:
|
|
Packit |
0848f5 |
* lock // Note: this may block
|
|
Packit |
0848f5 |
* rma operations (see below)
|
|
Packit |
0848f5 |
* unlock
|
|
Packit |
0848f5 |
*
|
|
Packit |
0848f5 |
* unlock send back to partner
|
|
Packit |
0848f5 |
* receive from partner
|
|
Packit |
0848f5 |
* check for correct data
|
|
Packit |
0848f5 |
*
|
|
Packit |
0848f5 |
* The delay may be implemented as a ring of message communication; this
|
|
Packit |
0848f5 |
* is likely to automatically scale the time to what is needed
|
|
Packit |
0848f5 |
*/
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Define a datatype to be used with */
|
|
Packit |
0848f5 |
int stride = 11;
|
|
Packit |
0848f5 |
int veccount = 7;
|
|
Packit |
0848f5 |
MPI_Datatype vectype;
|
|
Packit |
0848f5 |
/* Define long RMA ops size */
|
|
Packit |
0848f5 |
int longcount = 512;
|
|
Packit |
0848f5 |
int medcount = 127;
|
|
Packit |
0848f5 |
int mednum = 4;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
void RMATest(int i, MPI_Win win, int master, int *srcbuf, int srcbufsize, int *getbuf,
|
|
Packit |
0848f5 |
int getbufsize);
|
|
Packit |
0848f5 |
int RMACheck(int i, int *buf, MPI_Aint bufsize);
|
|
Packit |
0848f5 |
int RMACheckGet(int i, MPI_Win win, int *getbuf, MPI_Aint getsize);
|
|
Packit |
0848f5 |
void RMATestInit(int i, int *buf, MPI_Aint bufsize);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
int main(int argc, char *argv[])
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
int errs = 0;
|
|
Packit |
0848f5 |
MPI_Win win;
|
|
Packit |
0848f5 |
int *rmabuffer = 0, *getbuf = 0;
|
|
Packit |
0848f5 |
MPI_Aint bufsize = 0, getbufsize = 0;
|
|
Packit |
0848f5 |
int master, partner, next, wrank, wsize, i;
|
|
Packit |
0848f5 |
int ntest = LAST_TEST;
|
|
Packit |
0848f5 |
int *srcbuf;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MTest_Init(&argc, &argv);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Determine who is responsible for each part of the test */
|
|
Packit |
0848f5 |
MPI_Comm_rank(MPI_COMM_WORLD, &wrank);
|
|
Packit |
0848f5 |
MPI_Comm_size(MPI_COMM_WORLD, &wsize);
|
|
Packit |
0848f5 |
if (wsize < 3) {
|
|
Packit |
0848f5 |
fprintf(stderr, "This test requires at least 3 processes\n");
|
|
Packit |
0848f5 |
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
master = 0;
|
|
Packit |
0848f5 |
partner = 1;
|
|
Packit |
0848f5 |
next = wrank + 1;
|
|
Packit |
0848f5 |
if (next == partner)
|
|
Packit |
0848f5 |
next++;
|
|
Packit |
0848f5 |
if (next >= wsize) {
|
|
Packit |
0848f5 |
next = 0;
|
|
Packit |
0848f5 |
if (next == partner)
|
|
Packit |
0848f5 |
next++;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Determine the last test to run (by default, run them all) */
|
|
Packit |
0848f5 |
for (i = 1; i < argc; i++) {
|
|
Packit |
0848f5 |
if (strcmp("-ntest", argv[i]) == 0) {
|
|
Packit |
0848f5 |
i++;
|
|
Packit |
0848f5 |
if (i < argc) {
|
|
Packit |
0848f5 |
ntest = atoi(argv[i]);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
else {
|
|
Packit |
0848f5 |
fprintf(stderr, "Missing value for -ntest\n");
|
|
Packit |
0848f5 |
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Type_vector(veccount, 1, stride, MPI_INT, &vectype);
|
|
Packit |
0848f5 |
MPI_Type_commit(&vectype);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Create the RMA window */
|
|
Packit |
0848f5 |
bufsize = 0;
|
|
Packit |
0848f5 |
if (wrank == master) {
|
|
Packit |
0848f5 |
bufsize = RMA_SIZE;
|
|
Packit |
0848f5 |
MPI_Alloc_mem(bufsize * sizeof(int), MPI_INFO_NULL, &rmabuffer);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
else if (wrank == partner) {
|
|
Packit |
0848f5 |
getbufsize = RMA_SIZE;
|
|
Packit |
0848f5 |
getbuf = (int *) malloc(getbufsize * sizeof(int));
|
|
Packit |
0848f5 |
if (!getbuf) {
|
|
Packit |
0848f5 |
fprintf(stderr, "Unable to allocated %d bytes for getbuf\n", (int) getbufsize);
|
|
Packit |
0848f5 |
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
srcbuf = malloc(RMA_SIZE * sizeof(*srcbuf));
|
|
Packit |
0848f5 |
assert(srcbuf);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Win_create(rmabuffer, bufsize * sizeof(int), sizeof(int), MPI_INFO_NULL,
|
|
Packit |
0848f5 |
MPI_COMM_WORLD, &win);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Run a sequence of tests */
|
|
Packit |
0848f5 |
for (i = 0; i <= ntest; i++) {
|
|
Packit |
0848f5 |
if (wrank == master) {
|
|
Packit |
0848f5 |
MTestPrintfMsg(0, "Test %d\n", i);
|
|
Packit |
0848f5 |
/* Because this lock is local, it must return only when the
|
|
Packit |
0848f5 |
* lock is acquired */
|
|
Packit |
0848f5 |
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, master, win);
|
|
Packit |
0848f5 |
RMATestInit(i, rmabuffer, bufsize);
|
|
Packit |
0848f5 |
MPI_Send(MPI_BOTTOM, 0, MPI_INT, partner, i, MPI_COMM_WORLD);
|
|
Packit |
0848f5 |
MPI_Send(MPI_BOTTOM, 0, MPI_INT, next, i, MPI_COMM_WORLD);
|
|
Packit |
0848f5 |
MPI_Recv(MPI_BOTTOM, 0, MPI_INT, MPI_ANY_SOURCE, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
|
|
Packit |
0848f5 |
MPI_Win_unlock(master, win);
|
|
Packit |
0848f5 |
MPI_Recv(MPI_BOTTOM, 0, MPI_INT, partner, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
|
|
Packit |
0848f5 |
errs += RMACheck(i, rmabuffer, bufsize);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
else if (wrank == partner) {
|
|
Packit |
0848f5 |
MPI_Recv(MPI_BOTTOM, 0, MPI_INT, master, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
|
|
Packit |
0848f5 |
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, master, win);
|
|
Packit |
0848f5 |
RMATest(i, win, master, srcbuf, RMA_SIZE, getbuf, getbufsize);
|
|
Packit |
0848f5 |
MPI_Win_unlock(master, win);
|
|
Packit |
0848f5 |
errs += RMACheckGet(i, win, getbuf, getbufsize);
|
|
Packit |
0848f5 |
MPI_Send(MPI_BOTTOM, 0, MPI_INT, master, i, MPI_COMM_WORLD);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
else {
|
|
Packit |
0848f5 |
MPI_Recv(MPI_BOTTOM, 0, MPI_INT, MPI_ANY_SOURCE, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
|
|
Packit |
0848f5 |
MPI_Send(MPI_BOTTOM, 0, MPI_INT, next, i, MPI_COMM_WORLD);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (rmabuffer) {
|
|
Packit |
0848f5 |
MPI_Free_mem(rmabuffer);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
if (getbuf) {
|
|
Packit |
0848f5 |
free(getbuf);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
free(srcbuf);
|
|
Packit |
0848f5 |
MPI_Win_free(&win);
|
|
Packit |
0848f5 |
MPI_Type_free(&vectype);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MTest_Finalize(errs);
|
|
Packit |
0848f5 |
MPI_Finalize();
|
|
Packit |
0848f5 |
return MTestReturnValue(errs);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Perform the tests.
|
|
Packit |
0848f5 |
*
|
|
Packit |
0848f5 |
* The srcbuf must be passed in because the buffer must remain valid
|
|
Packit |
0848f5 |
* until the subsequent unlock call. */
|
|
Packit |
0848f5 |
void RMATest(int i, MPI_Win win, int master, int *srcbuf, int srcbufsize, int *getbuf,
|
|
Packit |
0848f5 |
int getbufsize)
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
int j, k;
|
|
Packit |
0848f5 |
int *source = srcbuf;
|
|
Packit |
0848f5 |
assert(srcbufsize == RMA_SIZE);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
for (j = 0; j < srcbufsize; j++)
|
|
Packit |
0848f5 |
source[j] = -j;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
switch (i) {
|
|
Packit |
0848f5 |
case 0: /* Single short put (1 word at OFFSET_1) */
|
|
Packit |
0848f5 |
source[0] = PUT_VAL;
|
|
Packit |
0848f5 |
MPI_Put(source, 1, MPI_INT, master, OFFSET_1, 1, MPI_INT, win);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 1: /* Single short accumulate (1 word of value 17 at OFFSET_2) */
|
|
Packit |
0848f5 |
source[0] = ACC_VAL;
|
|
Packit |
0848f5 |
MPI_Accumulate(source, 1, MPI_INT, master, OFFSET_2, 1, MPI_INT, MPI_SUM, win);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 2: /* Single short get (1 word at OFFSET_3) */
|
|
Packit |
0848f5 |
getbuf[0] = -1;
|
|
Packit |
0848f5 |
MPI_Get(getbuf, 1, MPI_INT, master, OFFSET_3, 1, MPI_INT, win);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 3: /* Datatype single put (strided put) */
|
|
Packit |
0848f5 |
for (j = 0; j < veccount; j++) {
|
|
Packit |
0848f5 |
source[j * stride] = PUT_VAL + j;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPI_Put(source, 1, vectype, master, OFFSET_1, 1, vectype, win);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 4: /* Datatype single accumulate (strided acc) */
|
|
Packit |
0848f5 |
for (j = 0; j < veccount; j++) {
|
|
Packit |
0848f5 |
source[j * stride] = ACC_VAL + j;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPI_Accumulate(source, 1, vectype, master, OFFSET_2, 1, vectype, MPI_SUM, win);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 5: /* Datatype single get (strided get) */
|
|
Packit |
0848f5 |
for (j = 0; j < veccount; j++) {
|
|
Packit |
0848f5 |
getbuf[j] = -j;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPI_Get(getbuf, 1, vectype, master, OFFSET_3, 1, vectype, win);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 6: /* a few small puts (like strided put, but 1 word at a time) */
|
|
Packit |
0848f5 |
for (j = 0; j < veccount; j++) {
|
|
Packit |
0848f5 |
source[j * stride] = PUT_VAL + j;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
for (j = 0; j < veccount; j++) {
|
|
Packit |
0848f5 |
MPI_Put(source + j * stride, 1, MPI_INT, master,
|
|
Packit |
0848f5 |
OFFSET_1 + j * stride, 1, MPI_INT, win);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 7: /* a few small accumulates (like strided acc, but 1 word at a time) */
|
|
Packit |
0848f5 |
for (j = 0; j < veccount; j++) {
|
|
Packit |
0848f5 |
source[j * stride] = ACC_VAL + j;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
for (j = 0; j < veccount; j++) {
|
|
Packit |
0848f5 |
MPI_Accumulate(source + j * stride, 1, MPI_INT, master,
|
|
Packit |
0848f5 |
OFFSET_2 + j * stride, 1, MPI_INT, MPI_SUM, win);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 8: /* a few small gets (like strided get, but 1 word at a time) */
|
|
Packit |
0848f5 |
for (j = 0; j < veccount; j++) {
|
|
Packit |
0848f5 |
getbuf[j * stride] = -j;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
for (j = 0; j < veccount; j++) {
|
|
Packit |
0848f5 |
MPI_Get(getbuf + j * stride, 1, MPI_INT, master,
|
|
Packit |
0848f5 |
OFFSET_3 + j * stride, 1, MPI_INT, win);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 9: /* Single long put (OFFSET_1) */
|
|
Packit |
0848f5 |
for (j = 0; j < longcount; j++)
|
|
Packit |
0848f5 |
source[j] = j;
|
|
Packit |
0848f5 |
MPI_Put(source, longcount, MPI_INT, master, OFFSET_1, longcount, MPI_INT, win);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 10: /* Single long accumulate (OFFSET_2) */
|
|
Packit |
0848f5 |
for (j = 0; j < longcount; j++)
|
|
Packit |
0848f5 |
source[j] = j;
|
|
Packit |
0848f5 |
MPI_Accumulate(source, longcount, MPI_INT, master,
|
|
Packit |
0848f5 |
OFFSET_2, longcount, MPI_INT, MPI_SUM, win);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 11: /* Single long get (OFFSET_3) */
|
|
Packit |
0848f5 |
for (j = 0; j < longcount; j++)
|
|
Packit |
0848f5 |
getbuf[j] = -j;
|
|
Packit |
0848f5 |
MPI_Get(getbuf, longcount, MPI_INT, master, OFFSET_3, longcount, MPI_INT, win);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 12: /* a few long puts (start at OFFSET_1, medcount) */
|
|
Packit |
0848f5 |
for (j = 0; j < mednum; j++) {
|
|
Packit |
0848f5 |
for (k = 0; k < medcount; k++) {
|
|
Packit |
0848f5 |
source[j * medcount + k] = j * 2 * medcount + k;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPI_Put(source + j * medcount, medcount, MPI_INT, master,
|
|
Packit |
0848f5 |
OFFSET_1 + j * 2 * medcount, medcount, MPI_INT, win);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 13: /* a few long accumulates (start at OFFSET_2, medcount) */
|
|
Packit |
0848f5 |
for (j = 0; j < mednum; j++) {
|
|
Packit |
0848f5 |
for (k = 0; k < medcount; k++) {
|
|
Packit |
0848f5 |
source[j * medcount + k] = ACC_VAL + j * 2 * medcount + k;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPI_Accumulate(source + j * medcount, medcount, MPI_INT, master,
|
|
Packit |
0848f5 |
OFFSET_2 + j * 2 * medcount, medcount, MPI_INT, MPI_SUM, win);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 14: /* a few long gets (start at OFFSET_3, medcount) */
|
|
Packit |
0848f5 |
for (j = 0; j < mednum; j++) {
|
|
Packit |
0848f5 |
for (k = 0; k < medcount; k++) {
|
|
Packit |
0848f5 |
getbuf[j * medcount + k] = -(j * medcount + k);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPI_Get(getbuf + j * medcount, medcount, MPI_INT, master,
|
|
Packit |
0848f5 |
OFFSET_3 + j * 2 * medcount, medcount, MPI_INT, win);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
int RMACheck(int i, int *buf, MPI_Aint bufsize)
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
int j, k;
|
|
Packit |
0848f5 |
int errs = 0;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
switch (i) {
|
|
Packit |
0848f5 |
case 0: /* Single short put (1 word at OFFSET_1) */
|
|
Packit |
0848f5 |
if (buf[OFFSET_1] != PUT_VAL) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case 0: value is %d should be %d\n", buf[OFFSET_1], PUT_VAL);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 1: /* Single short accumulate (1 word of value 17 at OFFSET_2) */
|
|
Packit |
0848f5 |
if (buf[OFFSET_2] != ACC_VAL + OFFSET_2) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case 1: value is %d should be %d\n", buf[OFFSET_2], ACC_VAL + OFFSET_2);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 2: /* Single short get (1 word at OFFSET_3) */
|
|
Packit |
0848f5 |
/* See RMACheckGet */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 3: /* Datatype single put (strided put) */
|
|
Packit |
0848f5 |
case 6: /* a few small puts (like strided put, but 1 word at a time) */
|
|
Packit |
0848f5 |
/* FIXME: The conditional and increment are reversed below. This looks
|
|
Packit |
0848f5 |
* like a bug, and currently prevents the following test from running. */
|
|
Packit |
0848f5 |
for (j = 0; j++; j < veccount) {
|
|
Packit |
0848f5 |
if (buf[j * stride] != PUT_VAL + j) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case %d: value is %d should be %d\n", i, buf[j * stride], PUT_VAL + j);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 4: /* Datatype single accumulate (strided acc) */
|
|
Packit |
0848f5 |
case 7: /* a few small accumulates (like strided acc, but 1 word at a time) */
|
|
Packit |
0848f5 |
/* FIXME: The conditional and increment are reversed below. This looks
|
|
Packit |
0848f5 |
* like a bug, and currently prevents the following test from running. */
|
|
Packit |
0848f5 |
for (j = 0; j++; j < veccount) {
|
|
Packit |
0848f5 |
if (buf[j * stride] != ACC_VAL + j + OFFSET_2 + j * stride) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case %d: value is %d should be %d\n", i,
|
|
Packit |
0848f5 |
buf[j * stride], ACC_VAL + j + OFFSET_2 + j * stride);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 5: /* Datatype single get (strided get) */
|
|
Packit |
0848f5 |
case 8: /* a few small gets (like strided get, but 1 word at a time) */
|
|
Packit |
0848f5 |
/* See RMACheckGet */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 9: /* Single long put (OFFSET_1) */
|
|
Packit |
0848f5 |
for (j = 0; j < longcount; j++) {
|
|
Packit |
0848f5 |
if (buf[OFFSET_1 + j] != j) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case 9: value is %d should be %d\n", buf[OFFSET_1 + j], OFFSET_1 + j);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 10: /* Single long accumulate (OFFSET_2) */
|
|
Packit |
0848f5 |
for (j = 0; j < longcount; j++) {
|
|
Packit |
0848f5 |
if (buf[OFFSET_2 + j] != OFFSET_2 + j + j) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case 10: value is %d should be %d\n", buf[OFFSET_2 + j], OFFSET_2 + j + j);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 11: /* Single long get (OFFSET_3) */
|
|
Packit |
0848f5 |
/* See RMACheckGet */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 12: /* a few long puts (start at OFFSET_1, medcount) */
|
|
Packit |
0848f5 |
for (j = 0; j < mednum; j++) {
|
|
Packit |
0848f5 |
for (k = 0; k < medcount; k++) {
|
|
Packit |
0848f5 |
if (buf[OFFSET_1 + j * 2 * medcount + k] != j * 2 * medcount + k) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case 12: value is %d should be %d\n",
|
|
Packit |
0848f5 |
buf[OFFSET_1 + j * 2 * medcount + k], j * 2 * medcount + k);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 13: /* a few long accumulates (start at OFFSET_2, medcount) */
|
|
Packit |
0848f5 |
for (j = 0; j < mednum; j++) {
|
|
Packit |
0848f5 |
for (k = 0; k < medcount; k++) {
|
|
Packit |
0848f5 |
if (buf[OFFSET_2 + j * 2 * medcount + k] !=
|
|
Packit |
0848f5 |
OFFSET_2 + 2 * j * 2 * medcount + 2 * k + ACC_VAL) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case 13: value is %d should be %d\n",
|
|
Packit |
0848f5 |
buf[OFFSET_2 + j * 2 * medcount + k],
|
|
Packit |
0848f5 |
OFFSET_2 + 2 * j * 2 * medcount + k + ACC_VAL);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 14: /* a few long gets (start at OFFSET_3, medcount) */
|
|
Packit |
0848f5 |
/* See RMACheckGet */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
default:
|
|
Packit |
0848f5 |
fprintf(stderr, "Unrecognized case %d\n", i);
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
return errs;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
int RMACheckGet(int i, MPI_Win win, int *getbuf, MPI_Aint getsize)
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
int errs = 0;
|
|
Packit |
0848f5 |
int j, k;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* */
|
|
Packit |
0848f5 |
switch (i) {
|
|
Packit |
0848f5 |
case 0: /* Single short put (1 word at OFFSET_1) */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 1: /* Single short accumulate (1 word of value 17 at OFFSET_2) */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 2: /* Single short get (1 word at OFFSET_3) */
|
|
Packit |
0848f5 |
if (getbuf[0] != OFFSET_3) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case 2: value is %d should be %d\n", getbuf[0], OFFSET_3);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 3: /* Datatype single put (strided put) */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 4: /* Datatype single accumulate (strided acc) */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 5: /* Datatype single get (strided get) */
|
|
Packit |
0848f5 |
case 8: /* a few small gets (like strided get, but 1 word at a time) */
|
|
Packit |
0848f5 |
for (j = 0; j < veccount; j++) {
|
|
Packit |
0848f5 |
if (getbuf[j * stride] != OFFSET_3 + j * stride) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case %d: value is %d should be %d\n", i,
|
|
Packit |
0848f5 |
getbuf[j * stride], OFFSET_3 + j * stride);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 6: /* a few small puts (like strided put, but 1 word at a time) */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 7: /* a few small accumulates (like strided acc, but 1 word at a time) */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 9: /* Single long put (OFFSET_1) */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 10: /* Single long accumulate (OFFSET_2) */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 11: /* Single long get (OFFSET_3) */
|
|
Packit |
0848f5 |
for (j = 0; j < longcount; j++) {
|
|
Packit |
0848f5 |
if (getbuf[j] != OFFSET_3 + j) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case 11: value is %d should be %d\n", getbuf[j], OFFSET_3 + j);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 12: /* a few long puts (start at OFFSET_1, medcount) */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 13: /* a few long accumulates (start at OFFSET_2, medcount) */
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case 14: /* a few long gets (start at OFFSET_3, medcount) */
|
|
Packit |
0848f5 |
for (j = 0; j < mednum; j++) {
|
|
Packit |
0848f5 |
for (k = 0; k < medcount; k++) {
|
|
Packit |
0848f5 |
if (getbuf[j * medcount + k] != OFFSET_3 + j * 2 * medcount + k) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
printf("case 14: buf[%d] value is %d should be %d\n",
|
|
Packit |
0848f5 |
j * medcount + k,
|
|
Packit |
0848f5 |
getbuf[j * medcount + k], OFFSET_3 + j * 2 * medcount + k);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
default:
|
|
Packit |
0848f5 |
fprintf(stderr, "Unrecognized case %d\n", i);
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
return errs;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
void RMATestInit(int i, int *buf, MPI_Aint bufsize)
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
int j;
|
|
Packit |
0848f5 |
for (j = 0; j < bufsize; j++) {
|
|
Packit |
0848f5 |
buf[j] = j;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|