Is a linear search actually necessary? Is there some order to the vpid's in the array? I would hope you could do a binary search, or if the vpid's are unordered, then hopefully this is a rarely invoked code path. Just thinking of scalability.
On Tue, Aug 14, 2012 at 2:18 PM, <svn-commit-mai...@open-mpi.org> wrote: > Author: rhc (Ralph Castain) > Date: 2012-08-14 14:17:59 EDT (Tue, 14 Aug 2012) > New Revision: 27035 > URL: https://svn.open-mpi.org/trac/ompi/changeset/27035 > > Log: > We can't just lookup the node in the node pool by daemon vpid as the daemons > aren't stored that way - this was done because when holes exist in daemon > vpids, we can generate huge orte_node_pool arrays even when only a few > daemons actually exist. So we have to search for the vpid in the array > > Text files modified: > trunk/orte/util/nidmap.c | 42 +++++++++++++++++++++++++++++++++++++-- > 1 files changed, 39 insertions(+), 3 deletions(-) > > Modified: trunk/orte/util/nidmap.c > ============================================================================== > --- trunk/orte/util/nidmap.c Tue Aug 14 14:11:09 2012 (r27034) > +++ trunk/orte/util/nidmap.c 2012-08-14 14:17:59 EDT (Tue, 14 Aug 2012) > (r27035) > @@ -1045,7 +1045,7 @@ > orte_std_cntr_t n; > opal_buffer_t buf; > int rc, j, k; > - orte_job_t *jdata; > + orte_job_t *jdata, *daemons; > orte_proc_t *proc, *pptr; > orte_node_t *node, *nptr; > orte_proc_state_t *states=NULL; > @@ -1061,6 +1061,8 @@ > goto cleanup; > } > > + daemons = orte_get_job_data_object(ORTE_PROC_MY_NAME->jobid); > + > n = 1; > /* cycle through the buffer */ > while (ORTE_SUCCESS == (rc = opal_dss.unpack(&buf, &jobid, &n, > ORTE_JOBID))) { > @@ -1167,10 +1169,44 @@ > proc->name.vpid = i; > opal_pointer_array_set_item(jdata->procs, i, proc); > } > - if (NULL == (node = > (orte_node_t*)opal_pointer_array_get_item(orte_node_pool, nodes[i]))) { > + /* we can't just lookup the node in the node pool by daemon vpid > + * as the daemons aren't stored that way - this was done because > + * when holes exist in daemon vpids, we can generate huge > orte_node_pool > + * arrays even when only a few daemons actually exist. So we > have to > + * search for the vpid in the array > + */ > + node = NULL; > + for (j=0; j < orte_node_pool->size; j++) { > + if (NULL == (nptr = > (orte_node_t*)opal_pointer_array_get_item(orte_node_pool, j))) { > + continue; > + } > + if (nptr->daemon->name.vpid == nodes[i]) { > + node = nptr; > + break; > + } > + } > + if (NULL == node) { > /* this should never happen, but protect ourselves anyway */ > node = OBJ_NEW(orte_node_t); > - opal_pointer_array_set_item(orte_node_pool, nodes[i], node); > + /* find the daemon */ > + found = false; > + for (j=0; j < daemons->procs->size; j++) { > + if (NULL == (pptr = > (orte_proc_t*)opal_pointer_array_get_item(daemons->procs, j))) { > + continue; > + } > + if (pptr->name.vpid == nodes[i]) { > + found = true; > + break; > + } > + } > + if (!found) { > + pptr = OBJ_NEW(orte_proc_t); > + pptr->name.jobid = ORTE_PROC_MY_NAME->jobid; > + pptr->name.vpid = nodes[i]; > + opal_pointer_array_set_item(daemons->procs, nodes[i], > pptr); > + } > + node->daemon = pptr; > + opal_pointer_array_add(orte_node_pool, node); > } > if (NULL != proc->node) { > if (node != proc->node) { > _______________________________________________ > svn-full mailing list > svn-f...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/svn-full -- Tim Mattox, Ph.D. - I'm a bright... http://www.the-brights.net/ timat...@open-mpi.org || tmat...@gmail.com