X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=contrib%2Fanalyze_brprob;h=093c1dea77a1989d3725c8effe5056ac20d86cfd;hb=120a04de68643e4f372c546ee4d68097d39f0fe5;hp=53de83e508f27f2e4a3e1bc118a5127ebb0d93ee;hpb=971d047512f5163a7b3aa9819fca0038f5a9edc8;p=pf3gnuchains%2Fgcc-fork.git diff --git a/contrib/analyze_brprob b/contrib/analyze_brprob index 53de83e508f..093c1dea77a 100755 --- a/contrib/analyze_brprob +++ b/contrib/analyze_brprob @@ -1,49 +1,48 @@ #!/usr/bin/awk -f # Script to analyze experimental results of our branch prediction heuristics -# Contributed by Jan Hubicka, SuSE inc. -# Copyright (C) 2001 Free Software Foundation, Inc. +# Contributed by Jan Hubicka, SuSE Inc. +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. # -# This file is part of GNU CC. +# This file is part of GCC. # -# GNU CC is free software; you can redistribute it and/or modify +# GCC is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) +# the Free Software Foundation; either version 3, or (at your option) # any later version. # -# GNU CC is distributed in the hope that it will be useful, +# GCC is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with GNU CC; see the file COPYING. If not, write to -# the Free Software Foundation, 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. +# along with GCC; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. # # # This script is used to calculate two basic properties of the branch prediction -# heuristics - coverage and hitrate. Coverage is number of executions of given +# heuristics - coverage and hitrate. Coverage is number of executions of a given # branch matched by the heuristics and hitrate is probability that once branch is # predicted as taken it is really taken. # -# These values are usefull to determine quality of given heuristics and hitrate +# These values are useful to determine the quality of given heuristics. Hitrate # may be directly used in predict.c. # # Usage: -# step 1: compile and profile your program. You need to use -fprofile-arcs +# Step 1: Compile and profile your program. You need to use -fprofile-arcs # flag to get the profiles -# step 2: Generate log files. The information about given heuristics are -# saved into *.life dumps. You need to pass -df swtich to compiler as well -# as -fbranch-probabilities to get results of profiling noted in the dumps. -# Ensure that there is no "Arc profiling: some edge counts were bad." warnings. -# Keep the -fprofile-arcs switch to ensure that CFGs match. -# step 3: Run this script to concatetation of all *.life files: +# Step 2: Generate log files. The information about given heuristics are +# saved into *.bp dumps. You need to pass the -db switch to the compiler as well +# as -fbranch-probabilities to get the results of profiling noted in the dumps. +# Ensure that there are no "Arc profiling: some edge counts were bad." warnings. +# Step 3: Run this script to concatenate all *.life files: # analyze_brprob `find . -name *.life` # the information is collected and print once all files are parsed. This # may take a while. -# Note that script does use bc to perform long arithmetic. -# step 4: Read the results. Basically following table is printed: -# (this is just example from very early stages of branch prediction pass +# Note that the script does use bc to perform long arithmetic. +# Step 4: Read the results. Basically the following table is printed: +# (this is just an example from a very early stage of branch prediction pass # development, so please don't take these numbers seriously) # #HEURISTICS BRANCHES (REL) HITRATE COVERAGE (REL) @@ -57,15 +56,15 @@ #loop branch 51 1.5% 99.26%/ 99.27% 26854 0.3% #noreturn call 951 27.6% 100.00%/100.00% 1759809 17.6% # -# The heuristics called "first match" is heuristics used by gcc branch +# The heuristic called "first match" is a heuristic used by GCC branch # prediction pass and it predicts 89.92% branches correctly. # # The quality of heuristics can be rated using both, coverage and hitrate # parameters. For example "loop branch" heuristics (predicting loopback edge -# as taken) have both very high hitrate and coverage, so it is very usefull. +# as taken) have both very high hitrate and coverage, so it is very useful. # On the other hand, "exit block" heuristics (predicting exit edges as not -# taken) have good hitrate, but poor coverage, so only 3 branches has been -# predicted. The "loop header" heuristics have problem, since it tends to +# taken) have good hitrate, but poor coverage, so only 3 branches have been +# predicted. The "loop header" heuristic has problems, since it tends to # misspredict. # # The implementation of this script is somewhat brute force. My awk skills @@ -113,37 +112,35 @@ BEGIN {nnames = 0} if (int(pred) < 50.0) { - hit = count - hit; + hit = count"-"hit; } counts[name]=counts[name] "+" count hits[name]=hits[name] "+" hit - if (int (hit) < (int (count) / 2)) - hit = count - hit; - phits[name]=phits[name] "+" hit + phits[name]=phits[name] "+(("hit")<"count"/2)*("count"-("hit"))+(("hit")>="count"/2)*("hit")" #BC crashes on long strings. Irritating. - if (length(counts[name]) > 4000) - { - counts[name] = longeval (counts[name]) - hits[name] = longeval (hits[name]) - phits[name] = longeval (phits[name]) - } + if (length(counts[name]) > 2000) + counts[name] = longeval(counts[name]) + if (length(hits[name]) > 2000) + hits[name] = longeval(hits[name]) + if (length(phits[name]) > 2000) + phits[name] = longeval(phits[name]) } END { # Heuristics called combined predicts just everything. - maxcounts = longeval (counts["first match"]) - maxbranches = branches["first match"] - max = names["firat match"] - printf("HEURISTICS BRANCHES (REL) HITRATE COVERAGE (REL)\n") + maxcounts = longeval(counts["combined"]) + maxbranches = branches["combined"] + max = names["combined"] + printf("HEURISTICS BRANCHES (REL) HITRATE COVERAGE (REL)\n") for (i = 0; i < nnames ; i++) { name = names[i] - counts[name] = longeval (counts[name]) - printf ("%-27s %8i %5.1f%% %6s%%/%6s%% %12s %5.1f%%\n", + counts[name] = longeval(counts[name]) + printf ("%-26s %8i %5.1f%% %6s%% / %6s%% %12s %5.1f%%\n", name, branches[name], branches[name] * 100 / maxbranches, - longeval ("("hits[name]") * 100 /(" counts[name]"-0.00001)"), - longeval ("("phits[name]") * 100 /(" counts[name]"-0.00001)"), - counts[name], longeval (counts[name]" * 100 / ("maxcounts"-0.00001)")) + longeval("("hits[name]") * 100 /(" counts[name]"-0.00001)"), + longeval("("phits[name]") * 100 /(" counts[name]"-0.00001)"), + counts[name], longeval(counts[name]" * 100 / ("maxcounts"-0.00001)")) } }