1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
3 * (C) 2001 by Argonne National Laboratory.
4 * See COPYRIGHT in top-level directory.
13 int do_test(int origin_count, MPI_Datatype origin_type, int result_count,
14 MPI_Datatype result_type, int target_count, MPI_Datatype target_type, MPI_Win win, int* win_buf, int* origin_buf, int* result_buf);
15 int do_test(int origin_count, MPI_Datatype origin_type, int result_count,
16 MPI_Datatype result_type, int target_count, MPI_Datatype target_type, MPI_Win win, int* win_buf, int* origin_buf, int* result_buf)
18 int errs = 0, ret, origin_type_size, result_type_size;
20 ret = MPI_Put(origin_buf, origin_count, origin_type, 1, 0, target_count, target_type, win);
24 ret = MPI_Get(origin_buf, origin_count, origin_type, 1, 0, target_count, target_type, win);
28 ret = MPI_Accumulate(origin_buf, origin_count, origin_type, 1, 0, target_count,
29 target_type, MPI_SUM, win);
33 ret = MPI_Get_accumulate(origin_buf, origin_count, origin_type, result_buf, result_count,
34 result_type, 1, 0, target_count, target_type, MPI_SUM, win);
38 MPI_Type_size(origin_type, &origin_type_size);
39 MPI_Type_size(result_type, &result_type_size);
41 if (origin_count == 0 || origin_type_size == 0) {
42 ret = MPI_Put(NULL, origin_count, origin_type, 1, 0, target_count, target_type, win);
46 ret = MPI_Get(NULL, origin_count, origin_type, 1, 0, target_count, target_type, win);
50 ret = MPI_Accumulate(NULL, origin_count, origin_type, 1, 0, target_count, target_type,
55 ret = MPI_Get_accumulate(NULL, origin_count, origin_type, result_buf, result_count,
56 result_type, 1, 0, target_count, target_type, MPI_SUM, win);
60 if (result_count == 0 || result_type_size == 0) {
61 ret = MPI_Get_accumulate(NULL, origin_count, origin_type, NULL, result_count,
62 result_type, 1, 0, target_count, target_type, MPI_SUM, win);
71 int main(int argc, char *argv[])
74 int win_buf[SIZE], origin_buf[SIZE], result_buf[SIZE];
75 int rank, nprocs, i, j, k;
77 MPI_Datatype types[4];
79 MPI_Init(&argc, &argv);
80 MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
81 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
84 printf("Run this program with 2 or more processes\n");
85 MPI_Abort(MPI_COMM_WORLD, 1);
88 /* types[0] is of zero size. Everything else is non-zero size */
89 MPI_Type_contiguous(0, MPI_INT, &types[0]);
90 MPI_Type_commit(&types[0]);
92 MPI_Type_contiguous(1, MPI_INT, &types[1]);
93 MPI_Type_commit(&types[1]);
96 types[3] = MPI_DOUBLE;
98 MPI_Win_create(win_buf, SIZE * sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &win);
100 MPI_Win_fence(0, win);
104 for (i = 0; i < 4; i++)
105 for (j = 0; j < 4; j++)
106 for (k = 0; k < 4; k++)
107 do_test(0, types[i], 0, types[j], 0, types[k], win, win_buf, origin_buf, result_buf);
109 /* single zero-size datatype, but non-zero count */
110 for (i = 1; i < 4; i++) {
111 for (j = 1; j < 4; j++) {
112 do_test(1, types[0], 0, types[i], 0, types[j], win, win_buf, origin_buf, result_buf);
113 do_test(0, types[i], 1, types[0], 0, types[j], win, win_buf, origin_buf, result_buf);
114 do_test(0, types[i], 0, types[j], 1, types[0], win, win_buf, origin_buf, result_buf);
118 /* two zero-size datatypes, but non-zero count */
119 for (i = 1; i < 4; i++) {
120 do_test(1, types[0], 1, types[0], 0, types[i], win, win_buf, origin_buf, result_buf);
121 do_test(1, types[0], 0, types[i], 1, types[0], win, win_buf, origin_buf, result_buf);
122 do_test(0, types[i], 1, types[0], 1, types[0], win, win_buf, origin_buf, result_buf);
124 do_test(1, types[0], 2, types[0], 0, types[i], win, win_buf, origin_buf, result_buf);
125 do_test(2, types[0], 1, types[0], 0, types[i], win, win_buf, origin_buf, result_buf);
127 do_test(1, types[0], 0, types[i], 2, types[0], win, win_buf, origin_buf, result_buf);
128 do_test(2, types[0], 0, types[i], 1, types[0], win, win_buf, origin_buf, result_buf);
130 do_test(0, types[i], 1, types[0], 2, types[0], win, win_buf, origin_buf, result_buf);
131 do_test(0, types[i], 2, types[0], 1, types[0], win, win_buf, origin_buf, result_buf);
134 /* three zero-size datatypes, but non-zero count */
135 do_test(1, types[0], 1, types[0], 1, types[0], win, win_buf, origin_buf, result_buf);
136 do_test(1, types[0], 1, types[0], 2, types[0], win, win_buf, origin_buf, result_buf);
137 do_test(1, types[0], 2, types[0], 1, types[0], win, win_buf, origin_buf, result_buf);
138 do_test(1, types[0], 2, types[0], 2, types[0], win, win_buf, origin_buf, result_buf);
139 do_test(2, types[0], 1, types[0], 1, types[0], win, win_buf, origin_buf, result_buf);
140 do_test(2, types[0], 1, types[0], 2, types[0], win, win_buf, origin_buf, result_buf);
141 do_test(2, types[0], 2, types[0], 1, types[0], win, win_buf, origin_buf, result_buf);
143 MPI_Win_fence(0, win);
146 MPI_Type_free(&types[0]);
147 MPI_Type_free(&types[1]);
150 printf(" No Errors\n");