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