From: simonmar Date: Fri, 12 May 2000 13:01:04 +0000 (+0000) Subject: [project @ 2000-05-12 13:01:04 by simonmar] X-Git-Tag: Approximately_9120_patches~4495 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=5ee90f9b922e51ac6613d860e728266e9bf4c84f;p=ghc-hetmet.git [project @ 2000-05-12 13:01:04 by simonmar] The time/allocation profile now shows costs as both - "individual" (incurred by the specific cost-centre stack), and - "inherited" (incurrent by the cost-centre stack and all its children). In addition, the "inner" column has been removed (should be the same as the sum of the scc counts of the children of the current node), and the "caf" column has been removed (wasn't very useful). --- diff --git a/ghc/includes/StgProf.h b/ghc/includes/StgProf.h index b2783ef..f19f4d2 100644 --- a/ghc/includes/StgProf.h +++ b/ghc/includes/StgProf.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: StgProf.h,v 1.9 2000/04/03 15:54:49 simonmar Exp $ + * $Id: StgProf.h,v 1.10 2000/05/12 13:01:04 simonmar Exp $ * * (c) The GHC Team, 1998 * @@ -65,13 +65,14 @@ typedef struct _CostCentreStack { struct _IndexTable *indexTable; unsigned long scc_count; - unsigned long sub_scc_count; - unsigned long sub_cafcc_count; unsigned long time_ticks; unsigned long mem_alloc; unsigned long mem_resid; + unsigned long inherited_ticks; + unsigned long inherited_alloc; + CostCentre *root; } CostCentreStack; @@ -192,11 +193,11 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ prevStack : NULL, \ indexTable : NULL, \ scc_count : 0, \ - sub_scc_count : 0, \ - sub_cafcc_count : 0, \ time_ticks : 0, \ mem_alloc : 0, \ mem_resid : 0, \ + inherited_ticks : 0, \ + inherited_alloc : 0, \ root : 0, \ }}; @@ -226,7 +227,6 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ # define SET_CCC_X(cc,do_subcc_count,do_scc_count) \ do { \ - if (do_subcc_count) { CCCS->sub_scc_count++; } \ CCCS = PushCostCentre(CCCS,cc); \ if (do_scc_count) { CCCS->scc_count++; } \ } while(0) @@ -268,7 +268,6 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ do { \ (stack)->scc_count = 0; \ (stack)->time_ticks = 0; \ - (stack)->sub_cafcc_count = 0; \ (stack)->mem_alloc = 0; \ } while(0) @@ -286,8 +285,6 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ #define ENTER_CCS_CAF_X(ccs) \ do { \ - /* inc subcaf count of CCCS */ \ - CCCS->sub_cafcc_count++; \ /* set CCCS to ident ccs */ \ CCCS = (CostCentreStack *)(ccs); \ /* inc scc count of CAF ccs */ \ diff --git a/ghc/rts/Profiling.c b/ghc/rts/Profiling.c index fe2c6e8..b40b298 100644 --- a/ghc/rts/Profiling.c +++ b/ghc/rts/Profiling.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Profiling.c,v 1.19 2000/04/19 12:42:48 simonmar Exp $ + * $Id: Profiling.c,v 1.20 2000/05/12 13:01:04 simonmar Exp $ * * (c) The GHC Team, 1998-2000 * @@ -119,21 +119,21 @@ CCS_DECLARE(CCS_DONT_CARE, CC_DONT_CARE, ); * Static Functions */ -static CostCentreStack * ActualPush_ ( CostCentreStack *ccs, CostCentre *cc, - CostCentreStack *new_ccs ); - -static rtsBool ccs_to_ignore ( CostCentreStack *ccs ); -static void count_ticks ( CostCentreStack *ccs ); -static void reportCCS ( CostCentreStack *ccs, nat indent ); -static void DecCCS ( CostCentreStack *ccs ); -static void DecBackEdge ( CostCentreStack *ccs, CostCentreStack *oldccs ); -static CostCentreStack *CheckLoop ( CostCentreStack *ccs, CostCentre *cc ); -static CostCentreStack *pruneCCSTree ( CostCentreStack *ccs ); - -static CostCentreStack *ActualPush ( CostCentreStack *, CostCentre * ); -static CostCentreStack *IsInIndexTable ( IndexTable *, CostCentre * ); -static IndexTable *AddToIndexTable ( IndexTable *, CostCentreStack *, - CostCentre *, unsigned int ); +static CostCentreStack * ActualPush_ ( CostCentreStack *ccs, CostCentre *cc, + CostCentreStack *new_ccs ); +static rtsBool ccs_to_ignore ( CostCentreStack *ccs ); +static void count_ticks ( CostCentreStack *ccs ); +static void inherit_costs ( CostCentreStack *ccs ); +static void reportCCS ( CostCentreStack *ccs, nat indent ); +static void DecCCS ( CostCentreStack *ccs ); +static void DecBackEdge ( CostCentreStack *ccs, + CostCentreStack *oldccs ); +static CostCentreStack * CheckLoop ( CostCentreStack *ccs, CostCentre *cc ); +static CostCentreStack * pruneCCSTree ( CostCentreStack *ccs ); +static CostCentreStack * ActualPush ( CostCentreStack *, CostCentre * ); +static CostCentreStack * IsInIndexTable ( IndexTable *, CostCentre * ); +static IndexTable * AddToIndexTable ( IndexTable *, CostCentreStack *, + CostCentre *, unsigned int ); #ifdef DEBUG static void printCCS ( CostCentreStack *ccs ); @@ -431,14 +431,14 @@ ActualPush_ ( CostCentreStack *ccs, CostCentre *cc, CostCentreStack *new_ccs ) /* Initialise the various _scc_ counters to zero */ new_ccs->scc_count = 0; - new_ccs->sub_scc_count = 0; - new_ccs->sub_cafcc_count = 0; /* Initialize all other stats here. There should be a quick way * that's easily used elsewhere too */ new_ccs->time_ticks = 0; new_ccs->mem_alloc = 0; + new_ccs->inherited_ticks = 0; + new_ccs->inherited_alloc = 0; new_ccs->root = ccs->root; @@ -487,27 +487,6 @@ AddToIndexTable(IndexTable *it, CostCentreStack *new_ccs, } -void -print_ccs (FILE *fp, CostCentreStack *ccs) -{ - if (ccs == CCCS) { - fprintf(fp, "Cost-Centre Stack: "); - } - - if (ccs != CCS_MAIN) - { - print_ccs(fp, ccs->prevStack); - fprintf(fp, "->[%s,%s]", ccs->cc->label, ccs->cc->module); - } else { - fprintf(fp, "[%s,%s]", ccs->cc->label, ccs->cc->module); - } - - if (ccs == CCCS) { - fprintf(fp, "\n"); - } -} - - static void DecCCS(CostCentreStack *ccs) { @@ -625,9 +604,10 @@ report_per_cc_costs( void ) static void fprint_header( void ) { - fprintf(prof_file, "%-24s %-10s", "COST CENTRE", "MODULE"); + fprintf(prof_file, "%-24s %-10s individual inherited\n", "", ""); - fprintf(prof_file, "%8s %5s %5s %8s %5s", "scc", "%time", "%alloc", "inner", "cafs"); + fprintf(prof_file, "%-24s %-10s", "COST CENTRE", "MODULE"); + fprintf(prof_file, "%8s %5s %5s %5s %5s", "entries", "%time", "%alloc", "%time", "%alloc"); if (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE) { fprintf(prof_file, " %5s %9s", "ticks", "bytes"); @@ -690,6 +670,8 @@ report_ccs_profiling( void ) report_per_cc_costs(); + inherit_costs(CCS_MAIN); + fprint_header(); reportCCS(pruneCCSTree(CCS_MAIN), 0); @@ -714,12 +696,14 @@ reportCCS(CostCentreStack *ccs, nat indent) fprintf(prof_file, "%-*s%-*s %-10s", indent, "", 24-indent, cc->label, cc->module); - fprintf(prof_file, "%8ld %5.1f %5.1f %8ld %5ld", + fprintf(prof_file, "%8ld %5.1f %5.1f %5.1f %5.1f", ccs->scc_count, total_prof_ticks == 0 ? 0.0 : (ccs->time_ticks / (StgFloat) total_prof_ticks * 100), total_alloc == 0 ? 0.0 : (ccs->mem_alloc / (StgFloat) total_alloc * 100), - ccs->sub_scc_count, ccs->sub_cafcc_count); - + total_prof_ticks == 0 ? 0.0 : (ccs->inherited_ticks / (StgFloat) total_prof_ticks * 100), + total_alloc == 0 ? 0.0 : (ccs->inherited_alloc / (StgFloat) total_alloc * 100) + ); + if (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE) { fprintf(prof_file, " %5ld %9ld", ccs->time_ticks, ccs->mem_alloc*sizeof(W_)); #if defined(PROFILING_DETAIL_COUNTS) @@ -758,6 +742,28 @@ count_ticks(CostCentreStack *ccs) } } +/* Traverse the cost centre stack tree and inherit ticks & allocs. + */ +static void +inherit_costs(CostCentreStack *ccs) +{ + IndexTable *i; + + if (ccs_to_ignore(ccs)) { return; } + + ccs->inherited_ticks += ccs->time_ticks; + ccs->inherited_alloc += ccs->mem_alloc; + + for (i = ccs->indexTable; i != NULL; i = i->next) + if (!i->back_edge) { + inherit_costs(i->ccs); + ccs->inherited_ticks += i->ccs->inherited_ticks; + ccs->inherited_alloc += i->ccs->inherited_alloc; + } + + return; +} + /* return rtsTrue if it is one of the ones that * should not be reported normally (because it confuses * the users) @@ -797,17 +803,11 @@ pruneCCSTree( CostCentreStack *ccs ) /* force printing of *all* cost centres if -P -P */ ) || ( ccs->indexTable != 0 ) - || ( (ccs->scc_count || ccs->sub_scc_count || - ccs->time_ticks || ccs->mem_alloc - || (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE - && (ccs->sub_cafcc_count -#if defined(PROFILING_DETAIL_COUNTS) - || cc->thunk_count || cc->function_count || cc->pap_count -#endif - ))))) { - return ccs; + || ( ccs->scc_count || ccs->time_ticks || ccs->mem_alloc ) + ) { + return ccs; } else { - return NULL; + return NULL; } } @@ -847,6 +847,27 @@ reportCCS_XML(CostCentreStack *ccs) } } +void +print_ccs (FILE *fp, CostCentreStack *ccs) +{ + if (ccs == CCCS) { + fprintf(fp, "Cost-Centre Stack: "); + } + + if (ccs != CCS_MAIN) + { + print_ccs(fp, ccs->prevStack); + fprintf(fp, "->[%s,%s]", ccs->cc->label, ccs->cc->module); + } else { + fprintf(fp, "[%s,%s]", ccs->cc->label, ccs->cc->module); + } + + if (ccs == CCCS) { + fprintf(fp, "\n"); + } +} + + #ifdef DEBUG static void printCCS ( CostCentreStack *ccs )