5
/* $Id: test_groups.c,v 1.3 2004-11-22 20:29:53 manoj Exp $ */
19
# define sleep(x) Sleep(1000*(x))
24
/*#include "armcip.h"*/
30
/***************************** macros ************************/
31
#define COPY(src, dst, bytes) memcpy((dst),(src),(bytes))
32
#define ABS(a) (((a) >= 0) ? (a) : (-(a)))
33
#define MIN(a,b) (((a)<(b)) ? (a) : (b))
35
/***************************** global data *******************/
37
void *work[MAXPROC]; /* work array for propagating addresses */
40
void pvm_init(int argc, char *argv[])
42
int mytid, mygid, ctid[MAXPROC];
46
if ((argc != 2) && (argc != 1)) {
53
if ((np = atoi(argv[1])) < 1) {
60
mygid = pvm_joingroup(MPGROUP);
64
i = pvm_spawn(argv[0], argv + 1, 0, "", np - 1, ctid);
67
while (pvm_gsize(MPGROUP) < np) {
72
pvm_barrier(MPGROUP, np);
74
printf("PVM initialization done!\n");
79
fprintf(stderr, "usage: %s <nproc>\n", argv[0]);
85
void create_array(void *a[], int elem_size, int ndim, int dims[])
87
int bytes = elem_size, i, rc;
89
assert(ndim <= MAXDIMS);
90
for (i = 0; i < ndim; i++) {
94
rc = ARMCI_Malloc(a, bytes);
101
void destroy_array(void *ptr[])
105
assert(!ARMCI_Free(ptr[me]));
112
/* to check if a process belongs to this group */
113
int chk_grp_membership(int rank, ARMCI_Group *grp, int *memberlist)
116
ARMCI_Group_size(grp, &grp_size);
117
for (i = 0; i < grp_size; i++) if (rank == memberlist[i]) {
123
void test_one_group(ARMCI_Group *group, int *pid_list)
125
int grp_me, grp_size;
126
int i, j, src_proc, dst_proc;
127
double *ddst_put[MAXPROC];
131
world_me = armci_msg_me();
132
ARMCI_Group_rank(group, &grp_me);
133
ARMCI_Group_size(group, &grp_size);
135
printf("GROUP SIZE = %d\n", grp_size);
137
printf("%d:group rank = %d\n", me, grp_me);
140
dst_proc = grp_size - 1;
142
bytes = ELEMS * sizeof(double);
143
ARMCI_Malloc_group((void **)ddst_put, bytes, group);
145
for (i = 0; i < ELEMS; i++) {
146
dsrc[i] = i * 1.001 * (grp_me + 1);
148
for (i = 0; i < ELEMS; i++) {
149
ddst_put[grp_me][i] = -1.0;
152
armci_msg_group_barrier(group);
154
if (grp_me == src_proc) {
155
/* NOTE: make sure to specify absolute ids in ARMCI calls */
156
ARMCI_Put(dsrc, &ddst_put[dst_proc][0], bytes,
157
ARMCI_Absolute_id(group, dst_proc));
160
armci_msg_group_barrier(group);
161
/* NOTE: make sure to specify absolute ids in ARMCI calls */
162
ARMCI_Fence(ARMCI_Absolute_id(group, dst_proc));
167
if (grp_me == dst_proc) {
168
for (j = 0; j < ELEMS; j++) {
169
if (ABS(ddst_put[grp_me][j] - j * 1.001 *(src_proc + 1)) > 0.1) {
170
printf("\t%d: ddst_put[%d][%d] = %f and expected value is %f\n",
171
me, grp_me, j, ddst_put[grp_me][j], j * 1.001 *(src_proc + 1));
172
ARMCI_Error("groups: armci put failed...1", 0);
175
printf("\n%d(%d): Test O.K. Verified\n", dst_proc, world_me);
177
armci_msg_group_barrier(group);
178
ARMCI_Free_group(ddst_put[grp_me], group);
185
int pid_listA[MAXPROC] = {0, 1, 2};
186
int pid_listB[MAXPROC] = {1, 3};
187
ARMCI_Group groupA, groupB;
191
ARMCI_Group_create(GNUM_A, pid_listA, &groupA); /* create group 1 */
192
ARMCI_Group_create(GNUM_B, pid_listB, &groupB); /* create group 2 */
195
/* ------------------------ GROUP A ------------------------- */
196
if (chk_grp_membership(me, &groupA, pid_listA)) { /* group A */
197
test_one_group(&groupA, pid_listA);
202
/* ------------------------ GROUP B ------------------------- */
203
if (chk_grp_membership(me, &groupB, pid_listB)) { /* group B */
204
test_one_group(&groupB, pid_listB);
217
* Random permutation of 0..n-1 into an array.
219
void random_permute(int *arr, int n)
222
int *vtmp = (int *)malloc(n * sizeof(int));
223
assert(vtmp != NULL);
224
for (i = 0; i < n; ++i) {
227
for (i = 0; i < n; i++) {
228
while (vtmp[j=(rand()%n)] != -1) /*no-op*/;
229
assert(vtmp[j] == -1);
236
int int_compare(const void *v1, const void *v2)
238
int i1 = *(int *)v1, i2 = *(int *)v2;
249
* Test routine for non-collective process group management. This test
250
* should not be used with MPI process group implementation.
253
#define MAX_GROUPS (MAXPROC/GROUP_SIZE)
254
void test_groups_noncollective()
256
int *pid_lists[MAX_GROUPS];
258
int i, nprocs, world_me;
260
int *my_pid_list = NULL, my_grp_size = 0;
264
nprocs = armci_msg_nproc();
265
world_me = armci_msg_me();
267
random_permute(pids, nproc);
269
ngrps = nprocs / GROUP_SIZE;
271
for (i = 0; i < nprocs / GROUP_SIZE; i++) {
272
pid_lists[i] = pids + (i * GROUP_SIZE);
275
for (i = 0; i < nprocs; i++) {
276
if (pids[i] == world_me) {
277
int grp_id = MIN(i / GROUP_SIZE, ngrps - 1);
278
my_pid_list = pid_lists[grp_id];
279
if (grp_id == ngrps - 1) {
280
my_grp_size = GROUP_SIZE + (nprocs % GROUP_SIZE);
283
my_grp_size = GROUP_SIZE;
288
qsort(my_pid_list, my_grp_size, sizeof(int), int_compare);
291
/*now create all these disjoint groups and test them in parallel*/
293
ARMCI_Group_create(my_grp_size, my_pid_list, &group);
295
test_one_group(&group, my_pid_list);
297
ARMCI_Group_free(&group);
309
int main(int argc, char *argv[])
311
armci_msg_init(&argc, &argv);
312
ARMCI_Init_args(&argc, &argv);
313
nproc = armci_msg_nproc();
316
/* printf("nproc = %d, me = %d\n", nproc, me);*/
318
if (nproc < MINPROC) {
320
printf("Test needs at least %d processors (%d used)\n",
324
armci_msg_finalize();
327
if (nproc > MAXPROC) {
329
printf("Test works for up to %d processors (%d used)\n",
333
armci_msg_finalize();
338
printf("ARMCI test program (%d processes)\n", nproc);
344
printf("\n Testing ARMCI Groups!\n\n");
353
printf("\n Collective groups: Success!!\n");
359
test_groups_noncollective();
364
printf("\n Non-collective groups: Success!!\n");
372
armci_msg_finalize();