1 /*
2  * Copyright (C) 2010. See COPYRIGHT in top-level directory.
3  */
4 
5 /** ARMCI Mutex RMW Test -- James Dinan <dinan@mcs.anl.gov>
6   *
7   * A mutex and shared integer live on process 0.  All processes lock, add a
8   * value to the integer, and unlock.  Process 0 confirms the final result.
9   */
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <assert.h>
14 
15 #include <mpi.h>
16 #include <armci.h>
17 
18 #define NITER 1000
19 #define ADDIN 5
20 
main(int argc,char ** argv)21 int main(int argc, char ** argv) {
22   int    rank, nproc, val, i;
23   void **base_ptrs;
24 
25   MPI_Init(&argc, &argv);
26   ARMCI_Init();
27 
28   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
29   MPI_Comm_size(MPI_COMM_WORLD, &nproc);
30 
31   if (rank == 0) printf("Starting ARMCI mutex read-modify-write test with %d processes\n", nproc);
32 
33   base_ptrs = malloc(nproc*sizeof(void*));
34 
35   ARMCI_Create_mutexes(rank == 0 ? 1 : 0);
36   ARMCI_Malloc(base_ptrs, (rank == 0) ? sizeof(int) : 0); // Proc 0 has a shared int
37 
38   if (rank == 0) {
39     val = 0;
40     ARMCI_Put(&val, base_ptrs[0], sizeof(int), 0);
41   }
42 
43   ARMCI_Barrier();
44 
45   for (i = 0; i < NITER; i++) {
46     ARMCI_Lock(0, 0);
47 
48     ARMCI_Get(base_ptrs[0], &val, sizeof(int), 0);
49     val += ADDIN;
50     ARMCI_Put(&val, base_ptrs[0], sizeof(int), 0);
51 
52     ARMCI_Unlock(0, 0);
53   }
54 
55   printf(" + %3d done\n", rank);
56   fflush(NULL);
57 
58   ARMCI_Barrier();
59 
60   if (rank == 0) {
61     ARMCI_Get(base_ptrs[0], &val, sizeof(int), 0);
62 
63     if (val == ADDIN*nproc*NITER)
64       printf("Test complete: PASS.\n");
65     else
66       printf("Test complete: FAIL.  Got %d, expected %d.\n", val, ADDIN*nproc*NITER);
67   }
68 
69   ARMCI_Free(base_ptrs[rank]);
70   ARMCI_Destroy_mutexes();
71   free(base_ptrs);
72 
73   ARMCI_Finalize();
74   MPI_Finalize();
75 
76   return 0;
77 }
78