1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
3 * (C) 2012 by Argonne National Laboratory.
4 * See COPYRIGHT in top-level directory.
11 /* tests passive target RMA on 2 processes. tests the lock-single_op-unlock
12 optimization for less common cases:
14 origin datatype derived, target datatype predefined
17 int main(int argc, char *argv[])
19 int wrank, nprocs, *srcbuf, *rmabuf, i;
25 MTest_Init(&argc, &argv);
26 MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
27 MPI_Comm_rank(MPI_COMM_WORLD, &wrank);
30 printf("Run this program with 2 or more processes\n");
31 MPI_Abort(MPI_COMM_WORLD, 1);
34 memsize = 10 * 4 * nprocs;
35 /* Create and initialize data areas */
36 srcbuf = (int *) malloc(sizeof(int) * memsize);
37 MPI_Alloc_mem(sizeof(int) * memsize, MPI_INFO_NULL, &rmabuf);
38 if (!srcbuf || !rmabuf) {
39 printf("Unable to allocate srcbuf and rmabuf of size %d\n", memsize);
40 MPI_Abort(MPI_COMM_WORLD, 1);
42 for (i = 0; i < memsize; i++) {
47 MPI_Win_create(rmabuf, memsize * sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &win);
49 /* Vector of 10 elements, separated by 4 */
50 MPI_Type_vector(10, 1, 4, MPI_INT, &vectype);
51 MPI_Type_commit(&vectype);
53 /* Accumulate with a derived origin type and target predefined type */
55 MPI_Barrier(MPI_COMM_WORLD);
56 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
57 for (i = 0; i < 10; i++) {
58 if (rmabuf[i] != -i + 4 * i) {
60 printf("Acc: expected rmabuf[%d] = %d but saw %d\n", i, -i + 4 * i, rmabuf[i]);
64 for (i = 10; i < memsize; i++) {
65 if (rmabuf[i] != -i) {
67 printf("Acc: expected rmabuf[%d] = %d but saw %d\n", i, -i, rmabuf[i]);
71 MPI_Win_unlock(0, win);
73 else if (wrank == 1) {
74 MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win);
75 MPI_Accumulate(srcbuf, 1, vectype, 0, 0, 10, MPI_INT, MPI_SUM, win);
76 MPI_Win_unlock(0, win);
77 MPI_Barrier(MPI_COMM_WORLD);
80 MPI_Barrier(MPI_COMM_WORLD);
83 MPI_Barrier(MPI_COMM_WORLD);
85 /* Put with a derived origin type and target predefined type */
87 MPI_Barrier(MPI_COMM_WORLD);
88 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
89 for (i = 0; i < 10; i++) {
90 if (rmabuf[i] != 4 * i) {
92 printf("Put: expected rmabuf[%d] = %d but saw %d\n", i, 4 * i, rmabuf[i]);
96 for (i = 10; i < memsize; i++) {
97 if (rmabuf[i] != -i) {
99 printf("Put: expected rmabuf[%d] = %d but saw %d\n", i, -i, rmabuf[i]);
103 MPI_Win_unlock(0, win);
105 else if (wrank == 1) {
106 MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win);
107 MPI_Put(srcbuf, 1, vectype, 0, 0, 10, MPI_INT, win);
108 MPI_Win_unlock(0, win);
109 MPI_Barrier(MPI_COMM_WORLD);
112 MPI_Barrier(MPI_COMM_WORLD);
115 MPI_Barrier(MPI_COMM_WORLD);
117 /* Put with a derived origin type and target predefined type, with
118 * a get (see the move-to-end optimization) */
120 MPI_Barrier(MPI_COMM_WORLD);
121 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
122 for (i = 0; i < 10; i++) {
123 if (rmabuf[i] != 4 * i) {
125 printf("Put: expected rmabuf[%d] = %d but saw %d\n", i, 4 * i, rmabuf[i]);
129 for (i = 10; i < memsize; i++) {
130 if (rmabuf[i] != -i) {
132 printf("Put: expected rmabuf[%d] = %d but saw %d\n", i, -i, rmabuf[i]);
136 MPI_Win_unlock(0, win);
138 else if (wrank == 1) {
140 MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win);
141 MPI_Get(&val, 1, MPI_INT, 0, 10, 1, MPI_INT, win);
142 MPI_Put(srcbuf, 1, vectype, 0, 0, 10, MPI_INT, win);
143 MPI_Win_unlock(0, win);
144 MPI_Barrier(MPI_COMM_WORLD);
147 printf("Get: Expected -10, got %d\n", val);
151 MPI_Barrier(MPI_COMM_WORLD);
154 MPI_Barrier(MPI_COMM_WORLD);
156 /* Put with a derived origin type and target predefined type, with
157 * a get already at the end (see the move-to-end optimization) */
159 MPI_Barrier(MPI_COMM_WORLD);
160 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
161 for (i = 0; i < 10; i++) {
162 if (rmabuf[i] != 4 * i) {
164 printf("Put: expected rmabuf[%d] = %d but saw %d\n", i, 4 * i, rmabuf[i]);
168 for (i = 10; i < memsize; i++) {
169 if (rmabuf[i] != -i) {
171 printf("Put: expected rmabuf[%d] = %d but saw %d\n", i, -i, rmabuf[i]);
175 MPI_Win_unlock(0, win);
177 else if (wrank == 1) {
179 MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win);
180 MPI_Put(srcbuf, 1, vectype, 0, 0, 10, MPI_INT, win);
181 MPI_Get(&val, 1, MPI_INT, 0, 10, 1, MPI_INT, win);
182 MPI_Win_unlock(0, win);
183 MPI_Barrier(MPI_COMM_WORLD);
186 printf("Get: Expected -10, got %d\n", val);
190 MPI_Barrier(MPI_COMM_WORLD);
194 MPI_Free_mem(rmabuf);
196 MPI_Type_free(&vectype);
198 MTest_Finalize(errs);