Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Reduce the size of partial shared malloc tests.
[simgrid.git] / teshsuite / smpi / mpich3-test / rma / at_complete.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *  (C) 2014 by Argonne National Laboratory.
4  *      See COPYRIGHT in top-level directory.
5  */
6
7 #include <stdio.h>
8 #include <mpi.h>
9
10 #define PUT_SIZE 1
11 #define GET_SIZE 100000
12 #define WIN_SIZE (PUT_SIZE+GET_SIZE)
13 #define LOOP 100
14
15 int main(int argc, char **argv)
16 {
17     MPI_Win win;
18     int i, k, rank, nproc;
19     int win_buf[WIN_SIZE], orig_get_buf[GET_SIZE], orig_put_buf[PUT_SIZE];
20     int orig_rank = 0, dest_rank = 1;
21     int errors = 0;
22     MPI_Group comm_group, orig_group, dest_group;
23
24     MPI_Init(&argc, &argv);
25
26     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
27     MPI_Comm_size(MPI_COMM_WORLD, &nproc);
28
29     MPI_Comm_group(MPI_COMM_WORLD, &comm_group);
30     MPI_Group_incl(comm_group, 1, &orig_rank, &orig_group);
31     MPI_Group_incl(comm_group, 1, &dest_rank, &dest_group);
32
33     for (i = 0; i < PUT_SIZE; i++)
34         orig_put_buf[i] = 1;
35     for (i = 0; i < GET_SIZE; i++)
36         orig_get_buf[i] = 0;
37     for (i = 0; i < WIN_SIZE; i++)
38         win_buf[i] = 1;
39
40     MPI_Win_create(win_buf, sizeof(int) * WIN_SIZE, sizeof(int), MPI_INFO_NULL,
41                    MPI_COMM_WORLD, &win);
42
43     for (k = 0; k < LOOP; k++) {
44
45         /* test for FENCE */
46
47         if (rank == orig_rank) {
48             MPI_Win_fence(MPI_MODE_NOPRECEDE, win);
49             MPI_Get(orig_get_buf, GET_SIZE, MPI_INT,
50                     dest_rank, PUT_SIZE /*disp */ , GET_SIZE, MPI_INT, win);
51             MPI_Put(orig_put_buf, PUT_SIZE, MPI_INT,
52                     dest_rank, 0 /*disp */ , PUT_SIZE, MPI_INT, win);
53             MPI_Win_fence(MPI_MODE_NOSUCCEED, win);
54
55             /* check GET result values */
56             for (i = 0; i < GET_SIZE; i++) {
57                 if (orig_get_buf[i] != 1) {
58                     printf("LOOP=%d, FENCE, orig_get_buf[%d] = %d, expected 1.\n",
59                            k, i, orig_get_buf[i]);
60                     errors++;
61                 }
62             }
63         }
64         else if (rank == dest_rank) {
65             MPI_Win_fence(MPI_MODE_NOPRECEDE, win);
66             MPI_Win_fence(MPI_MODE_NOSUCCEED, win);
67
68             /* modify the last element in window */
69             MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, win);
70             win_buf[WIN_SIZE - 1] = 2;
71             MPI_Win_unlock(rank, win);
72         }
73
74         MPI_Barrier(MPI_COMM_WORLD);
75         /* reset buffers */
76         for (i = 0; i < PUT_SIZE; i++)
77             orig_put_buf[i] = 1;
78         for (i = 0; i < GET_SIZE; i++)
79             orig_get_buf[i] = 0;
80         MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, win);
81         for (i = 0; i < WIN_SIZE; i++)
82             win_buf[i] = 1;
83         MPI_Win_unlock(rank, win);
84         MPI_Barrier(MPI_COMM_WORLD);
85
86         /* test for PSCW */
87
88         if (rank == orig_rank) {
89             MPI_Win_start(dest_group, 0, win);
90             MPI_Get(orig_get_buf, GET_SIZE, MPI_INT,
91                     dest_rank, PUT_SIZE /*disp */ , GET_SIZE, MPI_INT, win);
92             MPI_Put(orig_put_buf, PUT_SIZE, MPI_INT,
93                     dest_rank, 0 /*disp */ , PUT_SIZE, MPI_INT, win);
94             MPI_Win_complete(win);
95
96             /* check GET result values */
97             for (i = 0; i < GET_SIZE; i++) {
98                 if (orig_get_buf[i] != 1) {
99                     printf("LOOP=%d, PSCW, orig_get_buf[%d] = %d, expected 1.\n",
100                            k, i, orig_get_buf[i]);
101                     errors++;
102                 }
103             }
104         }
105         else if (rank == dest_rank) {
106             MPI_Win_post(orig_group, 0, win);
107             MPI_Win_wait(win);
108
109             /* modify the last element in window */
110             MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, win);
111             win_buf[WIN_SIZE - 1] = 2;
112             MPI_Win_unlock(rank, win);
113         }
114
115         MPI_Barrier(MPI_COMM_WORLD);
116         /* reset buffers */
117         for (i = 0; i < PUT_SIZE; i++)
118             orig_put_buf[i] = 1;
119         for (i = 0; i < GET_SIZE; i++)
120             orig_get_buf[i] = 0;
121         MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, win);
122         for (i = 0; i < WIN_SIZE; i++)
123             win_buf[i] = 1;
124         MPI_Win_unlock(rank, win);
125         MPI_Barrier(MPI_COMM_WORLD);
126     }
127
128     MPI_Win_free(&win);
129
130     MPI_Group_free(&orig_group);
131     MPI_Group_free(&dest_group);
132     MPI_Group_free(&comm_group);
133
134     if (rank == orig_rank && errors == 0) {
135         printf(" No Errors\n");
136     }
137
138     MPI_Finalize();
139     return 0;
140 }