void test_one_group(ARMCI_Group *group, int *pid_list) { int grp_me, grp_size; int i,j,src_proc,dst_proc; double *ddst_put[MAXPROC]; double dsrc[ELEMS]; int elems[2] = {MAXPROC,ELEMS}; int value = -1, bytes, world_me; MP_MYID(&world_me); ARMCI_Group_rank(group, &grp_me); ARMCI_Group_size(group, &grp_size); if(grp_me==0) printf("GROUP SIZE = %d\n", grp_size); printf("%d:group rank = %d\n", me, grp_me); src_proc = 0; dst_proc = grp_size-1; bytes = ELEMS*sizeof(double); ARMCI_Malloc_group((void **)ddst_put, bytes, group); for(i=0; i<ELEMS; i++) dsrc[i]=i*1.001*(grp_me+1); for(i=0; i<ELEMS; i++) ddst_put[grp_me][i]=-1.0; armci_msg_group_barrier(group); if(grp_me==src_proc) { /* NOTE: make sure to specify absolute ids in ARMCI calls */ ARMCI_Put(dsrc, &ddst_put[dst_proc][0], bytes, ARMCI_Absolute_id(group,dst_proc)); } armci_msg_group_barrier(group); /* NOTE: make sure to specify absolute ids in ARMCI calls */ ARMCI_Fence(ARMCI_Absolute_id(group,dst_proc)); sleep(1); /* Verify*/ if(grp_me==dst_proc) { for(j=0; j<ELEMS; j++) { if(ARMCI_ABS(ddst_put[grp_me][j]-j*1.001*(src_proc+1)) > 0.1) { printf("\t%d: ddst_put[%d][%d] = %lf and expected value is %lf\n", me, grp_me, j, ddst_put[grp_me][j], j*1.001*(src_proc+1)); ARMCI_Error("groups: armci put failed...1", 0); } } printf("\n%d(%d): Test O.K. Verified\n", dst_proc, world_me); } armci_msg_group_barrier(group); ARMCI_Free_group(ddst_put[grp_me], group); }
/* Create a child group for to the given group. @param n IN #procs in this group (<= that in group_parent) @param pid_list IN The list of proc ids (w.r.t. group_parent) @param group_out OUT Handle to store the created group @param group_parent IN Parent group */ void ARMCI_Group_create_child(int n, int *pid_list, ARMCI_Group *group_out, ARMCI_Group *grp_parent) { int i,grp_me; ARMCI_iGroup *igroup = (ARMCI_iGroup *)group_out; #ifdef ARMCI_GROUP armci_grp_attr_t *grp_attr = &igroup->grp_attr; int world_me, parent_grp_me; #else int rv; ARMCI_iGroup *igroup_parent = (ARMCI_iGroup *)grp_parent; MPI_Group *group_parent; MPI_Comm *comm_parent; #endif #ifdef ARMCI_GROUP ARMCI_Group_rank(grp_parent, &parent_grp_me); for(i=0; i<n; i++) { if(pid_list[i] == parent_grp_me) { break; } } if(i==n) { /*this initialization is used in group free*/ grp_attr->nproc=0; grp_attr->proc_list = NULL; return; /*not in group to be created*/ } #endif for(i=0; i<n-1;i++) { if(pid_list[i] > pid_list[i+1]){ armci_die("ARMCI_Group_create: Process ids are not sorted ",armci_me); break; } } #ifdef ARMCI_GROUP grp_attr->grp_clus_info = NULL; grp_attr->nproc = n; grp_attr->proc_list = (int *)malloc(n*sizeof(int)); assert(grp_attr->proc_list!=NULL); for(i=0; i<n; i++) { grp_attr->proc_list[i] = ARMCI_Absolute_id(grp_parent,pid_list[i]); } /* MPI_Comm_rank(MPI_COMM_WORLD, &world_me); */ world_me = armci_msg_me(); grp_attr->grp_me = grp_me = MPI_UNDEFINED; for(i=0; i<n; i++) { if(igroup->grp_attr.proc_list[i] == world_me) { grp_attr->grp_me = grp_me = i; break; } } if(grp_me != MPI_UNDEFINED) armci_cache_attr(group_out); armci_msg_group_barrier(group_out); #else /* NOTE: default group is the parent group */ group_parent = &(igroup_parent->igroup); comm_parent = &(igroup_parent->icomm); rv=MPI_Group_incl(*group_parent, n, pid_list, &(igroup->igroup)); if(rv != MPI_SUCCESS) armci_die("MPI_Group_incl: Failed ",armci_me); rv = MPI_Comm_create(*comm_parent, (MPI_Group)(igroup->igroup), (MPI_Comm*)&(igroup->icomm)); if(rv != MPI_SUCCESS) armci_die("MPI_Comm_create: Failed ",armci_me); /* processes belong to this group should cache attributes */ MPI_Group_rank((MPI_Group)(igroup->igroup), &grp_me); igroup->grp_attr.grp_clus_info=NULL; if(grp_me != MPI_UNDEFINED) armci_cache_attr(group_out); #endif }