/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2015 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
/* This code tests the case when a large ACC is issued, and then
* several small ACCs is issued between the same origin and target.
* The purpose of this test is to check if the ordering of ACCs
* is guaranteed. */
#include "mpi.h"
#include <stdio.h>
#include <stdint.h>
#define LOOP 5
#define DATA_COUNT 8192
int main(int argc, char *argv[])
{
int rank, nprocs;
MPI_Win win;
uint64_t buf[DATA_COUNT], orig_buf[DATA_COUNT];
uint64_t small_orig_buf_1 = 2, small_orig_buf_2[2] = { 3, 3 };
int i, j, error = 0;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
for (j = 0; j < LOOP; j++) {
error = 0;
for (i = 0; i < DATA_COUNT; i++) {
buf[i] = 0;
orig_buf[i] = 1;
}
MPI_Win_create(buf, sizeof(uint64_t) * DATA_COUNT, sizeof(uint64_t),
MPI_INFO_NULL, MPI_COMM_WORLD, &win);
MPI_Win_fence(0, win);
if (rank == 0) {
/* ACC (atomic PUT) to win_buf[0...DATA_COUNT-1] */
MPI_Accumulate(orig_buf, DATA_COUNT, MPI_UINT64_T, 1, 0, DATA_COUNT, MPI_UINT64_T,
MPI_REPLACE, win);
/* ACC (atomic PUT) to win_buf[0] */
MPI_Accumulate(&small_orig_buf_1, 1, MPI_UINT64_T, 1, 0, 1, MPI_UINT64_T, MPI_REPLACE,
win);
/* ACC (atomic PUT) to win_buf[1,2] */
MPI_Accumulate(&small_orig_buf_2, 2, MPI_UINT64_T, 1, 1, 2, MPI_UINT64_T, MPI_REPLACE,
win);
}
MPI_Win_fence(0, win);
if (rank == 1) {
for (i = 0; i < DATA_COUNT; i++) {
if (i == 0) {
if (buf[i] != 2) {
error++;
}
}
else if (i == 1 || i == 2) {
if (buf[i] != 3) {
error++;
}
}
else {
if (buf[i] != 1) {
error++;
}
}
}
}
MPI_Win_free(&win);
}
if (rank == 1 && error == 0) {
printf(" No Errors\n");
}
MPI_Finalize();
return 0;
}