Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix+activate rma test
[simgrid.git] / teshsuite / smpi / mpich3-test / rma / rput_local_comp.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *
4  *  (C) 2014 by Argonne National Laboratory.
5  *      See COPYRIGHT in top-level directory.
6  */
7 #include <mpi.h>
8 #include <stdio.h>
9 #include <assert.h>
10 #include "mpitest.h"
11
12 #define ITER 100
13 #define MAX_SIZE 65536
14
15 int main(int argc, char *argv[])
16 {
17     int rank, nproc, i;
18     int errors = 0, all_errors = 0;
19     int *buf = NULL, *winbuf = NULL;
20     MPI_Win window;
21
22     MPI_Init(&argc, &argv);
23     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
24     MPI_Comm_size(MPI_COMM_WORLD, &nproc);
25
26     if (nproc < 2) {
27         if (rank == 0)
28             printf("Error: must be run with two or more processes\n");
29         MPI_Abort(MPI_COMM_WORLD, 1);
30     }
31
32     MPI_Alloc_mem(MAX_SIZE * sizeof(int), MPI_INFO_NULL, &buf);
33     MPI_Alloc_mem(MAX_SIZE * sizeof(int), MPI_INFO_NULL, &winbuf);
34     MPI_Win_create(winbuf, MAX_SIZE * sizeof(int), sizeof(int), MPI_INFO_NULL,
35                    MPI_COMM_WORLD, &window);
36
37     MPI_Win_lock_all(0, window);
38
39     /* Test Rput local completion with small data.
40      * Small data is always copied to header packet as immediate data. */
41     if (rank == 1) {
42         for (i = 0; i < ITER; i++) {
43             MPI_Request put_req;
44             int val = -1;
45
46             buf[0] = rank;
47             MPI_Rput(&buf[0], 1, MPI_INT, 0, 0, 1, MPI_INT, window, &put_req);
48             MPI_Wait(&put_req, MPI_STATUS_IGNORE);
49
50             /* reset local buffer to check local completion */
51             buf[0] = 0;
52             MPI_Win_flush(0, window);
53
54             MPI_Get(&val, 1, MPI_INT, 0, 0, 1, MPI_INT, window);
55             MPI_Win_flush(0, window);
56
57             if (val != rank) {
58                 printf("%d - Got %d in small Rput test, expected %d\n", rank, val, rank);
59                 errors++;
60             }
61         }
62     }
63
64     MPI_Barrier(MPI_COMM_WORLD);
65
66     /* Test Rput local completion with large data .
67      * Large data is not suitable for 1-copy optimization, and always sent out
68      * from user buffer. */
69     if (rank == 1) {
70         for (i = 0; i < ITER; i++) {
71             MPI_Request put_req;
72             int val0 = -1, val1 = -1, val2 = -1;
73             int j;
74
75             /* initialize data */
76             for (j = 0; j < MAX_SIZE; j++) {
77                 buf[j] = rank + j + i;
78             }
79
80             MPI_Rput(buf, MAX_SIZE, MPI_INT, 0, 0, MAX_SIZE, MPI_INT, window, &put_req);
81             MPI_Wait(&put_req, MPI_STATUS_IGNORE);
82
83             /* reset local buffer to check local completion */
84             buf[0] = 0;
85             buf[MAX_SIZE - 1] = 0;
86             buf[MAX_SIZE / 2] = 0;
87             MPI_Win_flush(0, window);
88
89             /* get remote values which are modified in local buffer after wait */
90             MPI_Get(&val0, 1, MPI_INT, 0, 0, 1, MPI_INT, window);
91             MPI_Get(&val1, 1, MPI_INT, 0, MAX_SIZE - 1, 1, MPI_INT, window);
92             MPI_Get(&val2, 1, MPI_INT, 0, MAX_SIZE / 2, 1, MPI_INT, window);
93             MPI_Win_flush(0, window);
94
95             if (val0 != rank + i) {
96                 printf("%d - Got %d in large Rput test, expected %d\n", rank, val0, rank + i);
97                 errors++;
98             }
99             if (val1 != rank + MAX_SIZE - 1 + i) {
100                 printf("%d - Got %d in large Rput test, expected %d\n", rank, val1,
101                        rank + MAX_SIZE - 1 + i);
102                 errors++;
103             }
104             if (val2 != rank + MAX_SIZE / 2 + i) {
105                 printf("%d - Got %d in large Rput test, expected %d\n", rank, val2,
106                        rank + MAX_SIZE / 2 + i);
107                 errors++;
108             }
109         }
110     }
111
112     MPI_Win_unlock_all(window);
113     MPI_Barrier(MPI_COMM_WORLD);
114
115     MPI_Win_free(&window);
116     if (buf)
117         MPI_Free_mem(buf);
118     if (winbuf)
119         MPI_Free_mem(winbuf);
120
121     MPI_Reduce(&errors, &all_errors, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
122
123     if (rank == 0 && all_errors == 0)
124         printf(" No Errors\n");
125
126     MPI_Finalize();
127
128     return 0;
129 }