[PATCH]: Dump the "degree of overlap" to compare static profile with instrumentation profile

Dehao Chen dehao@google.com
Thu Sep 22 04:03:00 GMT 2011


Hello!

During performance tuning, it's useful to know if the static profile
is accurate. This patch compares static profiles to instrumentation
profiles, and uses "degree of overlap" to measure its accuracy. Degree
of overlap is a number between 0 and 1, representing the correlation
between two profiles, and 1 means two profiles are identical. This
number is dumped if the instrumentation based profile is available and
-fdump-ipa-profile is specified.

Ok for mainline?
Thanks,
Dehao

2011-09-20  Dehao Chen  <dehao@google.com>

	* profile.c (compute_branch_probabilities): Compute and dump the
	overlap between the static estimation and the instrumentation profile.
	(OVERLAP_BASE): New macro.
	(compute_frequency_overlap): New function


Index: gcc/profile.c
===================================================================
--- gcc/profile.c	(revision 179073)
+++ gcc/profile.c	(working copy)
@@ -437,6 +437,39 @@ read_profile_edge_counts (gcov_type *exe
     return num_edges;
 }

+#define OVERLAP_BASE 10000
+
+/* Compare the static estimated profile to the actual profile, and
+   return the "degree of overlap" measure between them.
+
+   Degree of overlap is a number between 0 and OVERLAP_BASE. It is
+   the sum of each basic block's minimum relative weights between
+   two profiles. And overlap of OVERLAP_BASE means two profiles are
+   identical.  */
+
+static int
+compute_frequency_overlap (void)
+{
+  gcov_type count_total = 0, freq_total = 0;
+  int overlap = 0;
+  basic_block bb;
+
+  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
+    {
+      count_total += bb->count;
+      freq_total += bb->frequency;
+    }
+
+  if (count_total == 0 || freq_total == 0)
+    return 0;
+
+  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
+    overlap += MIN (bb->count * OVERLAP_BASE / count_total,
+		    bb->frequency * OVERLAP_BASE / freq_total);
+
+  return overlap;
+}
+
 /* Compute the branch probabilities for the various branches.
    Annotate them accordingly.

@@ -607,7 +640,13 @@ compute_branch_probabilities (unsigned c
 	}
     }
   if (dump_file)
-    dump_flow_info (dump_file, dump_flags);
+    {
+      int overlap = compute_frequency_overlap ();
+      dump_flow_info (dump_file, dump_flags);
+      fprintf (dump_file, "Static profile overlap: %d.%d%%\n",
+	       overlap / (OVERLAP_BASE / 100),
+	       overlap % (OVERLAP_BASE / 100));
+    }

   total_num_passes += passes;
   if (dump_file)



More information about the Gcc-patches mailing list