Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of scm.gforge.inria.fr:/gitroot/simgrid/simgrid
[simgrid.git] / teshsuite / smpi / mpich3-test / rma / compare_and_swap.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *
4  *  (C) 2012 by Argonne National Laboratory.
5  *      See COPYRIGHT in top-level directory.
6  */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <assert.h>
11 #include <mpi.h>
12 #include "mpitest.h"
13 #include "squelch.h"
14
15 #define ITER 100
16
17 int main(int argc, char **argv) {
18     int       i, j, rank, nproc;
19     int       errors = 0, all_errors = 0;
20     int      *val_ptr;
21     MPI_Win   win;
22
23     MPI_Init(&argc, &argv);
24
25     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
26     MPI_Comm_size(MPI_COMM_WORLD, &nproc);
27
28     val_ptr = malloc(sizeof(int));
29
30     *val_ptr = 0;
31
32     MPI_Win_create(val_ptr, sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &win);
33
34     /* Test self communication */
35
36     for (i = 0; i < ITER; i++) {
37         int next = i + 1, result = -1;
38         MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, win);
39         MPI_Compare_and_swap(&next, &i, &result, MPI_INT, rank, 0, win);
40         MPI_Win_unlock(rank, win);
41         if (result != i) {
42             SQUELCH( printf("%d->%d -- Error: next=%d compare=%d result=%d val=%d\n", rank,
43                            rank, next, i, result, *val_ptr); );
44             errors++;
45         }
46     }
47
48     MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, win);
49     *val_ptr = 0;
50     MPI_Win_unlock(rank, win);
51
52     MPI_Barrier(MPI_COMM_WORLD);
53
54     /* Test neighbor communication */
55
56     for (i = 0; i < ITER; i++) {
57         int next = i + 1, result = -1;
58         MPI_Win_lock(MPI_LOCK_EXCLUSIVE, (rank+1)%nproc, 0, win);
59         MPI_Compare_and_swap(&next, &i, &result, MPI_INT, (rank+1)%nproc, 0, win);
60         MPI_Win_unlock((rank+1)%nproc, win);
61         if (result != i) {
62             SQUELCH( printf("%d->%d -- Error: next=%d compare=%d result=%d val=%d\n", rank,
63                            (rank+1)%nproc, next, i, result, *val_ptr); );
64             errors++;
65         }
66     }
67
68     fflush(NULL);
69
70     MPI_Barrier(MPI_COMM_WORLD);
71     MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, win);
72     *val_ptr = 0;
73     MPI_Win_unlock(rank, win);
74     MPI_Barrier(MPI_COMM_WORLD);
75
76
77     /* Test contention */
78
79     if (rank != 0) {
80         for (i = 0; i < ITER; i++) {
81             int next = i + 1, result = -1;
82             MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
83             MPI_Compare_and_swap(&next, &i, &result, MPI_INT, 0, 0, win);
84             MPI_Win_unlock(0, win);
85         }
86     }
87
88     MPI_Barrier(MPI_COMM_WORLD);
89
90     if (rank == 0 && nproc > 1) {
91         if (*val_ptr != ITER) {
92             SQUELCH( printf("%d - Error: expected=%d val=%d\n", rank, ITER, *val_ptr); );
93             errors++;
94         }
95     }
96
97     MPI_Win_free(&win);
98
99     MPI_Reduce(&errors, &all_errors, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
100
101     if (rank == 0 && all_errors == 0)
102         printf(" No Errors\n");
103
104     free(val_ptr);
105     MPI_Finalize();
106
107     return 0;
108 }