/* d: size of comm_speed */ void TreeMatchMapping(int nb_obj, int nb_proc, double **comm_mat, double *obj_weight, double * comm_speed, int d, int *sol){ tree_t *comm_tree; tm_topology_t *topology; double duration; int i; TIC; for(i=0;i<nb_obj;i++){ sol[i]=i; // printf("%f ",obj_weight[i]); } //printf("\n"); // return; topology=(tm_topology_t*)malloc(sizeof(tm_topology_t)); topology->arity=(int*)malloc(sizeof(int)*MAX_LEVELS); topology->arity[0]=nb_proc; topology->nb_levels=decompose((int)ceil((1.0*nb_obj)/nb_proc),1,topology->arity); printf("Topology nb levels=%d\n",topology->nb_levels); build_synthetic_proc_id(topology); if(topology->nb_levels>d) update_comm_speed(&comm_speed,d,topology->nb_levels); //exit(-1); //topology_to_arch(topology); //display_tab(arch,hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_PROC)); //display_tab(arch,96); //exit(-1); //int nb_core=topo_nb_proc(topology,1000); //display_tab(comm_mat,N); TIC; comm_tree=build_tree_from_topology(topology,comm_mat,nb_obj,obj_weight,comm_speed); printf("Tree buildinbg time=%f\n",TOC); TIC; map_topology(topology,comm_tree,nb_proc,1,sol,NULL); printf("Topology mapping time=%f\n",TOC); if(topology->nb_levels>d) free(comm_speed); free_topology(topology); free_tree(comm_tree); duration=TOC; printf("-------------- Mapping done in %.4fs!\n",duration); }
/* transform a tgt scotch file into a topology file*/ tm_topology_t * tgt_to_tm(char *filename, double **pcost) { tm_topology_t *topology = NULL; FILE *pf = NULL; char line[1024]; char *s = NULL; double *cost = NULL; int i; pf = fopen(filename,"r"); if(!pf){ if(get_verbose_level() >= CRITICAL) fprintf(stderr,"Cannot open %s\n",filename); exit(-1); } if(get_verbose_level() >= INFO) printf("Reading TGT file: %s\n",filename); fgets(line,1024,pf); s = strstr(line,"tleaf"); if(!s){ if(get_verbose_level() >= CRITICAL) fprintf(stderr,"Syntax error! %s is not a tleaf file\n",filename); exit(-1); } s += 5; while(isspace(*s)) s++; topology = (tm_topology_t*)MALLOC(sizeof(tm_topology_t)); topology->nb_levels = atoi(strtok(s," "))+1; topology->arity = (int*)MALLOC(sizeof(int)*topology->nb_levels); cost = (double*)CALLOC(topology->nb_levels,sizeof(double)); for( i = 0 ; i < topology->nb_levels-1 ; i++ ){ topology->arity[i] = atoi(strtok(NULL," ")); cost[i] = atoi(strtok(NULL," ")); } topology->arity[topology->nb_levels-1] = 0; /* cost[topology->nb_levels-1]=0; */ /*aggregate costs*/ for( i = topology->nb_levels-2 ; i >= 0 ; i-- ) cost[i] += cost[i+1]; build_synthetic_proc_id(topology); *pcost = cost; /* FREE(cost); */ /* topology->arity[0]=nb_proc; topology->nb_levels=decompose((int)ceil((1.0*nb_obj)/nb_proc),1,topology->arity); printf("levels=%d\n",topology->nb_levels); */ if(get_verbose_level() >= INFO) printf("Topology built from %s!\n",filename); return topology; }