1
1

Fix minor issues in the treematch topo

based on a patch provided by Guillaume.
Этот коммит содержится в:
George Bosilca 2015-10-25 21:38:59 -04:00
родитель 1105634ca1
Коммит 2622b9d3a1

Просмотреть файл

@ -328,9 +328,12 @@ int mca_topo_treematch_dist_graph_create(mca_topo_base_module_t* topo_module,
int array_size = effective_depth + 1;
int *myhierarchy = (int *)calloc(array_size,sizeof(int));
for (i = 0; i < array_size ; i++)
for (i = 0; i < array_size ; i++) {
myhierarchy[i] = hwloc_get_nbobjs_by_depth(opal_hwloc_topology,i);
#ifdef __DEBUG__
fprintf(stdout,"hierarchy[%i] = %i\n",i,myhierarchy[i]);
#endif
}
numlevels = 1;
for (i = 1; i < array_size; i++)
if ((myhierarchy[i] != 0) && (myhierarchy[i] != myhierarchy[i-1]))
@ -338,18 +341,13 @@ int mca_topo_treematch_dist_graph_create(mca_topo_base_module_t* topo_module,
tracker = (hwloc_obj_t *)calloc(numlevels,sizeof(hwloc_obj_t));
idx = 0;
tracker[idx++] = root_obj;
i = 1;
while (i < array_size){
if ( myhierarchy[i] != myhierarchy[i-1]) {
j = i;
while(myhierarchy[j] == myhierarchy[i])
if (++j > effective_depth)
break;
tracker[idx++] = hwloc_get_obj_by_depth(opal_hwloc_topology,j-1,0);
i = j;
} else i++;
if(myhierarchy[i] != myhierarchy[i-1])
tracker[idx++] = hwloc_get_obj_by_depth(opal_hwloc_topology,i-1,0);
i++;
}
tracker[idx] = hwloc_get_obj_by_depth(opal_hwloc_topology,effective_depth,0);
free(myhierarchy);
#ifdef __DEBUG__
@ -590,16 +588,36 @@ int mca_topo_treematch_dist_graph_create(mca_topo_base_module_t* topo_module,
}else{
tm_topology->arity = (int *)calloc(tm_topology->nb_levels,sizeof(int));
for(i = 0; i < tm_topology->nb_levels; i++)
tm_topology->arity[i] = hierarchies[i+1];
tm_topology->arity[i] = hierarchies[i+1]; /* fixme !!!*/
}
free(hierarchies);
#ifdef __DEBUG__
for(i = 0; i < tm_topology->nb_levels; i++)
fprintf(stdout,"topo_arity[%i] = %i\n",i,tm_topology->arity[i]);
#endif
/* compute the number of processing elements */
tm_topology->nb_nodes = (int *)calloc(tm_topology->nb_levels,sizeof(int));
tm_topology->nb_nodes[0] = 1;
for(i = 1 ; i < tm_topology->nb_levels; i++)
tm_topology->nb_nodes[i] = tm_topology->nb_nodes[i-1]*tm_topology->arity[i-1];
/* Build process id tab */
tm_topology->node_id = (int **)calloc(tm_topology->nb_levels,sizeof(int*));
for(i = 0; i < tm_topology->nb_levels ; i++) {
tm_topology->node_id[i] = (int *)calloc(tm_topology->nb_nodes[i],sizeof(int));
for (j = 0; j < tm_topology->nb_nodes[i] ; j++)
tm_topology->node_id[i][j] = obj_mapping[j];
}
#ifdef __DEBUG__
for(i = 0; i < tm_topology->nb_levels ; i++) {
fprintf(stdout,"tm topo node_id for level [%i] : ",i);
for(j = 0 ; j < tm_topology->nb_nodes[i] ; j++)
fprintf(stdout," [%i:%i] ",j,obj_mapping[j]);
fprintf(stdout,"\n");
}
display_topology(tm_topology);
#endif
comm_pattern = (double **)malloc(size*sizeof(double *));
for(i = 0 ; i < size ; i++)
comm_pattern[i] = local_pattern + i*size;
@ -619,23 +637,6 @@ int mca_topo_treematch_dist_graph_create(mca_topo_base_module_t* topo_module,
fprintf(stdout," %f ",comm_pattern[i][j]);
fprintf(stdout,"\n");
}
#endif
/* Build process id tab */
tm_topology->node_id = (int **)calloc(tm_topology->nb_levels,sizeof(int*));
for(i = 0; i < tm_topology->nb_levels ; i++) {
tm_topology->node_id[i] = (int *)calloc(tm_topology->nb_nodes[i],sizeof(int));
for (j = 0; j < tm_topology->nb_nodes[i] ; j++)
tm_topology->node_id[i][j] = obj_mapping[j];
}
#ifdef __DEBUG__
for(i = 0; i < tm_topology->nb_levels ; i++) {
fprintf(stdout,"tm topo node_id for level [%i] : ",i);
for(j = 0 ; j < tm_topology->nb_nodes[i] ; j++)
fprintf(stdout," [%i:%i] ",j,obj_mapping[j]);
fprintf(stdout,"\n");
}
display_topology(tm_topology);
#endif
k = (int *)calloc(num_objs_total,sizeof(int));
matching = (int *)calloc(size,sizeof(int));
@ -643,7 +644,6 @@ int mca_topo_treematch_dist_graph_create(mca_topo_base_module_t* topo_module,
tm_opt_topology = optimize_topology(tm_topology);
comm_tree = build_tree_from_topology(tm_opt_topology,comm_pattern,size,NULL,NULL);
map_topology_simple(tm_opt_topology,comm_tree,matching,size,k);
#ifdef __DEBUG__
fprintf(stdout,"====> nb levels : %i\n",tm_topology->nb_levels);
@ -880,9 +880,11 @@ int mca_topo_treematch_dist_graph_create(mca_topo_base_module_t* topo_module,
(void)opal_pmix.store_local((opal_process_name_t*)ORTE_PROC_MY_NAME, &kv);
OBJ_DESTRUCT(&kv);
if( OMPI_SUCCESS == (err = ompi_comm_create(comm_old,
if( OMPI_SUCCESS != (err = ompi_comm_create(comm_old,
comm_old->c_local_group,
newcomm))) {
ERR_EXIT(err);
} else {
/* Attach the dist_graph to the newly created communicator */
(*newcomm)->c_flags |= OMPI_COMM_DIST_GRAPH;
(*newcomm)->c_topo = topo_module;