Skip to content

Commit

Permalink
Fix profile feedback with -jN and add profile-fast
Browse files Browse the repository at this point in the history
Profile feedback always failed for me with -jN. The problem
was that there was no implicit ordering between the profile generate
stage and the profile use stage. So some objects in the later stage
would be linked with profile generate objects, and fail due
to the missing -lgcov.

This adds a new profile target that implicitely enforces the
correct ordering by using submakes. Plus a profile-install target
to also install. This is also nicer to type that PROFILE=...

Plus I always run the performance test suite now for the full
profile run.

In addition I also added a profile-fast / profile-fast-install
target the only runs the performance test suite instead of the
whole test suite. This significantly speeds up the profile build,
which was totally dominated by test suite run time. However
it may have less coverage of course.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Andi Kleen authored and Junio C Hamano committed Jul 8, 2014
1 parent 5d7fd6d commit 066dd26
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 6 deletions.
14 changes: 12 additions & 2 deletions INSTALL
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,28 @@ set up install paths (via config.mak.autogen), so you can write instead
If you're willing to trade off (much) longer build time for a later
faster git you can also do a profile feedback build with

$ make prefix=/usr PROFILE=BUILD all
$ make prefix=/usr profile
# make prefix=/usr PROFILE=BUILD install

This will run the complete test suite as training workload and then
rebuild git with the generated profile feedback. This results in a git
which is a few percent faster on CPU intensive workloads. This
may be a good tradeoff for distribution packagers.

Alternatively you can run profile feedback only with the git benchmark
suite. This runs significantly faster than the full test suite, but
has less coverage:

$ make prefix=/usr profile-fast
# make prefix=/usr PROFILE=BUILD install

Or if you just want to install a profile-optimized version of git into
your home directory, you could run:

$ make PROFILE=BUILD install
$ make profile-install

or
$ make profile-fast-install

As a caveat: a profile-optimized build takes a *lot* longer since the
git tree must be built twice, and in order for the profiling
Expand Down
21 changes: 17 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -1643,13 +1643,20 @@ SHELL = $(SHELL_PATH)
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
ifeq ($(filter all,$(MAKECMDGOALS)),all)
all:: profile-clean
all:: profile
endif

profile:: profile-clean
$(MAKE) PROFILE=GEN all
$(MAKE) PROFILE=GEN -j1 test
$(MAKE) PROFILE=GEN -j1 perf
endif
endif
$(MAKE) PROFILE=USE all

profile-fast: profile-clean
$(MAKE) PROFILE=GEN all
$(MAKE) PROFILE=GEN -j1 perf
$(MAKE) PROFILE=USE all


all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
ifneq (,$X)
Expand Down Expand Up @@ -2336,6 +2343,12 @@ mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

profile-install: profile
$(MAKE) install

profile-fast-install: profile-fast
$(MAKE) install

install: all
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
Expand Down

0 comments on commit 066dd26

Please sign in to comment.