2 * Copyright (C) by Argonne National Laboratory
3 * See COPYRIGHT in top-level directory
11 /* Similar test as isendirecv.c, but use MPI_Isendrecv_replace */
15 int rank, nproc, dest;
20 static void test_sendrecv(int offset)
22 for (int i = 0; i < nproc; i++) {
23 for (int j = 0; j < elems; j++) {
24 buf[i * elems + j] = rank * 100.0 + j;
28 for (int i = 0; i < nproc; i++) {
29 int j = (i + offset) % nproc;
30 MPI_Isendrecv_replace(&buf[elems * j], elems, MPI_FLOAT, i, 0, j, 0, comm, &reqs[i]);
33 MPI_Waitall(nproc, reqs, MPI_STATUSES_IGNORE);
35 for (int i = 0; i < nproc; i++) {
36 for (int j = 0; j < elems; j++) {
37 if (buf[i * elems + j] != i * 100.0 + j) {
39 fprintf(stderr, "buf(%d, %d) mismatch, got %f, expect %f\n", i, j,
40 buf[i * elems + j], (float) (i * 100.0 + j));
48 /* sendrecv may use the same or different source and destination,
49 * offset defines the offset between them */
51 int main(int argc, char *argv[])
53 MTest_Init(&argc, &argv);
55 comm = MPI_COMM_WORLD;
56 MPI_Comm_rank(comm, &rank);
57 MPI_Comm_size(comm, &nproc);
59 reqs = malloc(nproc * sizeof(MPI_Request));
60 buf = malloc(elems * nproc * sizeof(float));
62 for (int offset = 0; offset < nproc - 1; offset++) {
63 test_sendrecv(offset);
69 return MTestReturnValue(errs);