Skip to content

Conversation

@Keno
Copy link
Member

@Keno Keno commented Feb 17, 2025

This implements the optimization proposed in #57426 by keeping track of whether any bindings were replaced in image modules (excluding Main as facilitated by #57426). In addition, we augment serialization to keep track of whether a method body contains any GlobalRefs that point to a loaded (system or package) image. If both of these flags are true, we can skip scanning the body of the method, since we know that we neither need to add any additional backedges nor were any of the referenced bindings invalidated. The performance impact on end-to-end load time is small, but measurable. Overall @time using ModelingToolkit consistently improves about 5% using this PR. However, I should note that using time is still about 40% slower than 1.11. This is not necessarily an Apples-to-Apples comparison as there were substantial other changes on 1.12 (as well as current load-time-tunings targeting older versions), but I wanted to put the number context.

…dules

This implements the optimization proposed in #57426 by keeping track of whether
any bindings were replaced in image modules (excluding `Main` as facilitated by #57426).
In addition, we augment serialization to keep track of whether a method body contains
any GlobalRefs that point to a loaded (system or package) image. If both of these
flags are true, we can skip scanning the body of the method, since we know that we
neither need to add any additional backedges nor were any of the referenced bindings
invalidated. The performance impact on end-to-end load time is small, but measurable.
Overall `@time using ModelingToolkit` consistently improves about 5% using this PR.
However, I should note that using time is still about 40% slower than 1.11. This
is not necessarily an Apples-to-Apples comparison as there were substantial other
changes on 1.12 (as well as current load-time-tunings targeting older versions),
but I wanted to put the number context.
@Keno Keno merged commit f6e2b98 into master Feb 17, 2025
7 checks passed
@Keno Keno deleted the kf/partitionoptload branch February 17, 2025 06:24
@KristofferC KristofferC added the backport 1.12 Change should be backported to release-1.12 label Feb 17, 2025
KristofferC pushed a commit that referenced this pull request Feb 17, 2025
…dules (#57433)

This implements the optimization proposed in #57426 by keeping track of
whether any bindings were replaced in image modules (excluding `Main` as
facilitated by #57426). In addition, we augment serialization to keep
track of whether a method body contains any GlobalRefs that point to a
loaded (system or package) image. If both of these flags are true, we
can skip scanning the body of the method, since we know that we neither
need to add any additional backedges nor were any of the referenced
bindings invalidated. The performance impact on end-to-end load time is
small, but measurable. Overall `@time using ModelingToolkit`
consistently improves about 5% using this PR. However, I should note
that using time is still about 40% slower than 1.11. This is not
necessarily an Apples-to-Apples comparison as there were substantial
other changes on 1.12 (as well as current load-time-tunings targeting
older versions), but I wanted to put the number context.

(cherry picked from commit f6e2b98)
@KristofferC KristofferC mentioned this pull request Feb 17, 2025
24 tasks
# determine which CodeInstance objects are still valid in our image
# to enable any applicable new codes
methods_with_invalidated_source = Base.scan_new_methods(extext_methods, internal_methods)
backedges_only = unsafe_load(cglobal(:jl_first_image_replacement_world, UInt)) == typemax(UInt)
Copy link
Member

Choose a reason for hiding this comment

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

unsafe_load requires an atomic ordering specifier to access mutable data (this can be strong UB here without it, as we define unsafe_load to be a memcpy and not a unordered load)

KristofferC added a commit that referenced this pull request Feb 26, 2025
Backported PRs:
- [x] #57302 <!-- Add explicit imports for types and fix bugs -->
- [x] #57420 <!-- Compiler: Fix check for IRShow definedness -->
- [x] #57419 <!-- generated: Switch resolution module back to what it
was before -->
- [x] #57421 <!-- bpart: Skip implicit import reval if using'd export
set is unchanged -->
- [x] #57425 <!-- Prohibit binding replacement in closed modules during
precompile -->
- [x] #57426 <!-- Prohibit `import`ing or `using` Main during
incremental compilation -->
- [x] #57433 <!-- bpart: Track whether any binding replacement has
happened in image modules -->
- [x] #57445 <!-- Run all `--sysimage-native-code=no` cmdlineargs tests
single-threaded -->
- [x] #57386 <!-- Only strip invariant.load from special pointers -->
- [x] #57453 <!-- Revert "Make emitted egal code more loopy (#54121)"
-->
- [x] #57389 <!-- Change memory indexing to use the type as index
instead of i8 -->
- [x] #57447 <!-- Don't return null pointer when asking for the type of
a declared global -->
- [x] #57467 <!-- using/import: ensure world update after each
observable operation -->
- [x] #57471 <!-- staticdata: Don't use `newm` pointer after it has been
invalidated -->
- [x] #57416 <!-- lowering: Don't mutate lambda in `linearize` -->
@KristofferC KristofferC removed the backport 1.12 Change should be backported to release-1.12 label Feb 26, 2025
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.

3 participants