Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update RMA tests
[simgrid.git] / teshsuite / smpi / mpich3-test / rma / fence_shm.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
8 #include <stdio.h>
9 #include "mpi.h"
10 #include "mpitest.h"
11
12 #define ELEM_PER_PROC 1
13
14 static int errors = 0;
15
16 int main(int argc, char *argv[])
17 {
18     int rank, nprocs;
19     int shm_rank, shm_nprocs;
20     MPI_Comm shm_comm;
21     MPI_Win shm_win;
22     int *my_base;
23     int one = 1;
24     int result_data;
25
26     MTest_Init(&argc, &argv);
27
28     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
29     MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
30
31     /* run with two processes. */
32
33     MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, rank, MPI_INFO_NULL, &shm_comm);
34
35     MPI_Comm_rank(shm_comm, &shm_rank);
36     MPI_Comm_size(shm_comm, &shm_nprocs);
37
38     if (shm_nprocs >= 2) {
39         MPI_Win_allocate_shared(sizeof(int) * ELEM_PER_PROC, sizeof(int), MPI_INFO_NULL,
40                                 shm_comm, &my_base, &shm_win);
41
42         /* Test for FENCE with no asserts. */
43
44         if (shm_rank == 1) {
45             *my_base = 0;
46
47             MPI_Win_fence(0, shm_win);
48             MPI_Win_fence(0, shm_win);
49
50             if (my_base[0] != one) {
51                 errors++;
52                 printf("Expected: my_base[0] = %d   Actual: my_base[0] = %d\n", one, my_base[0]);
53             }
54         }
55
56         if (shm_rank == 0) {
57             MPI_Win_fence(0, shm_win);
58             MPI_Put(&one, 1, MPI_INT, 1, 0, 1, MPI_INT, shm_win);
59             MPI_Win_fence(0, shm_win);
60         }
61
62         /* Test for FENCE with assert MPI_MODE_NOPRECEDE. */
63
64         if (shm_rank == 1) {
65             MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 1, 0, shm_win);
66             MPI_Put(&one, 1, MPI_INT, 1, 0, 1, MPI_INT, shm_win);
67             MPI_Win_unlock(1, shm_win);
68
69             MPI_Win_fence(MPI_MODE_NOPRECEDE, shm_win);
70             MPI_Win_fence(0, shm_win);
71         }
72
73         if (shm_rank == 0) {
74             result_data = 0;
75             MPI_Win_fence(MPI_MODE_NOPRECEDE, shm_win);
76             MPI_Get(&result_data, 1, MPI_INT, 1, 0, 1, MPI_INT, shm_win);
77             MPI_Win_fence(0, shm_win);
78
79             if (result_data != one) {
80                 errors++;
81                 printf("Expected: result_data = %d   Actual: result_data = %d\n", one, result_data);
82             }
83         }
84
85         MPI_Win_free(&shm_win);
86     }
87
88     MPI_Comm_free(&shm_comm);
89
90     MTest_Finalize(errors);
91     MPI_Finalize();
92     return 0;
93 }