Skip to content

bpo-28643: Record profile-opt build progress with stamp files#4223

Merged
nascheme merged 3 commits into
python:masterfrom
nascheme:pgo_build_stamp
Nov 2, 2017
Merged

bpo-28643: Record profile-opt build progress with stamp files#4223
nascheme merged 3 commits into
python:masterfrom
nascheme:pgo_build_stamp

Conversation

@nascheme

@nascheme nascheme commented Nov 1, 2017

Copy link
Copy Markdown
Member

The profile-opt makefile target is expensive to build. Since the
makefile does not contain complete dependency information for this
target, much extra work can get done if the build is interrupted and
re-started. Even running "make" a second time will result in a huge
amount of redundant work.

As a minimal fix (rather than removing recursive "make" and adding a
proper dependency graph), split the profile-opt target into three parts:

  • build with profile generation enabled (profile-gen-stamp)
  • run task to generate profile information (profile-run-stamp)
  • build optimized Python using above information (profile-opt)

Use the "stamp" files profile-gen-stamp and profile-run-stamp to
record completion of the first two steps. The first will be cleaned by
the "clobber" target, the second by "profile-removal".

Other minor changes:

  • remove the "build_all_use_profile" target. I don't expect callers
    of the makefile to use this target so that should be safe.

  • remove "$(MAKE) clean" at the start of the profile-gen-stamp target.
    I assume that a profiled build normally starts from a clean source
    or build tree and so cleaning should not be required. Having the
    clean there causes an interruption of the profile-gen result in
    everthing getting built from scratch.

  • remove execution of "profile-removal" at end of "profile-opt". I
    don't see any reason to not to keep the profile information, given
    the cost to generate it. Removing the stamp files will force a
    re-build.

https://bugs.python.org/issue28643

The profile-opt makefile target is expensive to build. Since the
makefile does not contain complete dependency information for this
target, much extra work can get done if the build is interrupted and
re-started.  Even running "make" a second time will result in a huge
amount of redundant work.

As a minimal fix (rather than removing recursive "make" and adding a
proper dependency graph), split the profile-opt target into three parts:

- build with profile generation enabled (profile-gen-stamp)
- run task to generate profile information (profile-run-stamp)
- build optimized Python using above information (profile-opt)

Use the "stamp" files profile-gen-stamp and profile-run-stamp to
record completion of the first two steps.  The first will be cleaned by
the "clobber" target, the second by "profile-removal".

Other minor changes:

- remove the "build_all_use_profile" target.  I don't expect callers
  of the makefile to use this target so that should be safe.

- remove "$(MAKE) clean" at the start of the profile-gen-stamp target.
  I assume that a profiled build normally starts from a clean source
  or build tree and so cleaning should not be required.  Having the
  clean there causes an interruption of the profile-gen result in
  everthing getting built from scratch.

- remove execution of "profile-removal" at end of "profile-opt".  I
  don't see any reason to not to keep the profile information, given
  the cost to generate it.  Removing the stamp files will force a
  re-build.

@gpshead gpshead left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall LGTM, thank you for doing this. It should make repeated profile-opt builds easier to deal with.

there is a chance that someone could build with an outdated profile if they haven't run make clobber or make distclean - but that is rarely an issue. Important profile-opt builds likely to be included in a release anywhere should always be done with either a fresh build tree or at least after a make distclean.

Comment thread Makefile.pre.in Outdated
$(MAKE) profile-removal
# This is an expensive target to build and it does not have proper
# makefile dependancy information. So, we create a "stamp" file
# to record that it has been preformed and does not have to get

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd edit this to read

# to record its completion to avoid rerunning it unnecessarily.

Comment thread Makefile.pre.in Outdated

# Compile with profile generation
#
# Run "make clean" and remove stamp file to force re-build of the profile

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these should read "make clobber"

Add a profile-clean-stamp target.  We must make sure that Python is
built from a clean tree with -fprofile-generate before running the
profile task.
@nascheme
nascheme merged commit 4e38d71 into python:master Nov 2, 2017
embray pushed a commit to embray/cpython that referenced this pull request Nov 9, 2017
…#4223)

* bpo-28643: Record profile-opt build progress with stamp files

The profile-opt makefile target is expensive to build. Since the
makefile does not contain complete dependency information for this
target, much extra work can get done if the build is interrupted and
re-started.  Even running "make" a second time will result in a huge
amount of redundant work.

As a minimal fix (rather than removing recursive "make" and adding a
proper dependency graph), split the profile-opt target into parts:

- ensure tree is clean (profile-clean-stamp)
- build with profile generation enabled (profile-gen-stamp)
- run task to generate profile information (profile-run-stamp)
- build optimized Python using above information (profile-opt)

We use "stamp" files to record completion of the steps.  Running
"make clean" will not remove the profile-run-stamp file.

Other minor changes:

- remove the "build_all_use_profile" target.  I don't expect callers
  of the makefile to use this target so that should be safe.

- remove execution of "profile-removal" at end of "profile-opt".  I
  don't see any reason to not to keep the profile information, given
  the cost to generate it.  Removing the "profile-run-stamp" file
  will force re-generation of it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants