int pmixp_coll_belong_chk(const pmixp_proc_t *procs, size_t nprocs) { int i; pmixp_namespace_t *nsptr = pmixp_nspaces_local(); /* Find my namespace in the range */ for (i = 0; i < nprocs; i++) { if (0 != xstrcmp(procs[i].nspace, nsptr->name)) { continue; } if (pmixp_lib_is_wildcard(procs[i].rank)) return 0; if (0 <= pmixp_info_taskid2localid(procs[i].rank)) { return 0; } } /* we don't participate in this collective! */ PMIXP_ERROR("No process controlled by this slurmstepd is involved in this collective."); return -1; }
int pmixp_coll_belong_chk(pmixp_coll_type_t type, const pmix_proc_t *procs, size_t nprocs) { int i; pmixp_namespace_t *nsptr = pmixp_nspaces_local(); /* Find my namespace in the range */ for (i = 0; i < nprocs; i++) { if (0 != xstrcmp(procs[i].nspace, nsptr->name)) { continue; } if ((procs[i].rank == PMIX_RANK_WILDCARD)) return 0; if (0 <= pmixp_info_taskid2localid(procs[i].rank)) { return 0; } } /* we don't participate in this collective! */ PMIXP_ERROR("Have collective that doesn't include this job's namespace"); return -1; }
/* * information about relative ranks as assigned by the RM */ static void _set_procdatas(List lresp) { pmixp_namespace_t *nsptr = pmixp_nspaces_local(); pmix_info_t *kvp, *tkvp; char *p = NULL; int i; /* (char*) jobid assigned by scheduler */ xstrfmtcat(p, "%d.%d", pmixp_info_jobid(), pmixp_info_stepid()); PMIXP_ALLOC_KEY(kvp, PMIX_JOBID); PMIX_VAL_SET(&kvp->value, string, p); xfree(p); list_append(lresp, kvp); PMIXP_ALLOC_KEY(kvp, PMIX_NODEID); PMIX_VAL_SET(&kvp->value, uint32_t, nsptr->node_id); list_append(lresp, kvp); /* store information about local processes */ for (i = 0; i < pmixp_info_tasks(); i++) { List rankinfo; ListIterator it; int count, j, localid, nodeid; char *nodename; pmix_info_t *info; rankinfo = list_create(pmixp_xfree_xmalloced); PMIXP_ALLOC_KEY(kvp, PMIX_RANK); PMIX_VAL_SET(&kvp->value, int, i); list_append(rankinfo, kvp); /* TODO: always use 0 so far. this is not the general case though * (see SLURM MIMD: man srun, section MULTIPLE PROGRAM CONFIGURATION) */ PMIXP_ALLOC_KEY(kvp, PMIX_APPNUM); PMIX_VAL_SET(&kvp->value, int, 0); list_append(rankinfo, kvp); /* TODO: the same as for previous here */ PMIXP_ALLOC_KEY(kvp, PMIX_APPLDR); PMIX_VAL_SET(&kvp->value, int, 0); list_append(rankinfo, kvp); /* TODO: fix when several apps will appear */ PMIXP_ALLOC_KEY(kvp, PMIX_GLOBAL_RANK); PMIX_VAL_SET(&kvp->value, uint32_t, i); list_append(rankinfo, kvp); /* TODO: fix when several apps will appear */ PMIXP_ALLOC_KEY(kvp, PMIX_APP_RANK); PMIX_VAL_SET(&kvp->value, uint32_t, i); list_append(rankinfo, kvp); localid = pmixp_info_taskid2localid(i); /* this rank is local, store local info ab't it! */ if (0 <= localid) { PMIXP_ALLOC_KEY(kvp, PMIX_LOCAL_RANK); PMIX_VAL_SET(&kvp->value, uint16_t, localid); list_append(rankinfo, kvp); /* TODO: fix when several apps will appear */ PMIXP_ALLOC_KEY(kvp, PMIX_NODE_RANK); PMIX_VAL_SET(&kvp->value, uint16_t, localid); list_append(rankinfo, kvp); } nodeid = nsptr->task_map[i]; nodename = hostlist_nth(nsptr->hl, nodeid); PMIXP_ALLOC_KEY(kvp, PMIX_HOSTNAME); PMIX_VAL_SET(&kvp->value, string, nodename); list_append(rankinfo, kvp); free(nodename); /* merge rankinfo into one PMIX_PROC_DATA key */ count = list_count(rankinfo); PMIXP_ALLOC_KEY(kvp, PMIX_PROC_DATA); kvp->value.type = PMIX_INFO_ARRAY; kvp->value.data.array.size = count; PMIX_INFO_CREATE(info, count); it = list_iterator_create(rankinfo); j = 0; while (NULL != (tkvp = list_next(it))) { /* Just copy all the fields here. We will free original kvp's * using list_destroy without free'ing their fields so it is * safe to do so. */ info[j] = *tkvp; j++; } list_destroy(rankinfo); kvp->value.data.array.array = (pmix_info_t *)info; info = NULL; /* put the complex key to the list */ list_append(lresp, kvp); } }