-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
Actually setup jit targets when compiling packageimages instead of targeting only one #54471
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
src/processor_x86.cpp
Outdated
@@ -1084,16 +1082,14 @@ jl_image_t jl_init_processor_pkgimg(void *hdl) | |||
{ | |||
if (jit_targets.empty()) | |||
jl_error("JIT targets not initialized"); | |||
if (jit_targets.size() > 1) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we need to test that we still pick the right/one for all.
I have a unsubstantiated fear about loading images with mismatched ABI. Previously this code said to pick one and then ensured that everyone is consistent.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So what guarantees the right one is sysimg_init_cb
. We unconditionally look for the first one.
So checking that my understanding is correct. The issue is that when during sysimg creation we don't yet have a native cache so we are not filling jit targets based on that. Instead we actually parse the But for pkgimages we have an image loaded, so Maybe we should split parsing for output and choosing for loading/jit? |
So the code in |
With the script at #54464 (comment) I get % JULIA_CPU_TARGET='sandybridge,-xsaveopt;generic,clone_all;haswell,-rdrnd,base(1);x86-64-v4,-rdrnd,base(1)' julia-master example_targets.jl
ERROR: LoadError: Base.PkgId(Base.UUID("7876af07-990d-54b4-ab0e-23690620f79a"), "Example") has not yet been precompiled for julia 1.12.0-DEV.531
Stacktrace:
[1] error(::Base.PkgId, ::String, ::VersionNumber)
@ Base ./error.jl:53
[2] top-level scope
@ /tmp/example_targets.jl:13
[3] include
@ ./Base.jl:559 [inlined]
[4] exec_options(opts::Base.JLOptions)
@ Base ./client.jl:325
[5] _start()
@ Base ./client.jl:533
in expression starting at /tmp/example_targets.jl:13 The % julia-master example_targets.jl
targets = Base.ImageTarget[haswell; flags=0; features_en=(sse3, pclmul, ssse3, fma, cx16, sse4.1, sse4.2, movbe, popcnt, aes, xsave, avx, f16c, fsgsbase, bmi, avx2, bmi2, sahf, lzcnt), haswell; flags=0; features_en=(sse3, pclmul, ssse3, fma, cx16, sse4.1, sse4.2, movbe, popcnt, aes, xsave, avx, f16c, fsgsbase, bmi, avx2, bmi2, sahf, lzcnt)] Note that the target |
This isn't working :( |
b23d5e1
to
76ca4ba
Compare
76ca4ba
to
4980544
Compare
Small progress! Without % julia-master example_targets.jl
targets = Base.ImageTarget[haswell; flags=0; features_en=(sse3, pclmul, ssse3, fma, cx16, sse4.1, sse4.2, movbe, popcnt, aes, xsave, avx, f16c, fsgsbase, bmi, avx2, bmi2, sahf, lzcnt)] Now there's a single target, rather than two. But whenever % JULIA_CPU_TARGET='generic' julia-master example_targets.jl
ERROR: LoadError: Base.PkgId(Base.UUID("7876af07-990d-54b4-ab0e-23690620f79a"), "Example") has not yet been precompiled for julia 1.12.0-DEV.531
Stacktrace:
[1] error(::Base.PkgId, ::String, ::VersionNumber)
@ Base ./error.jl:53
[2] top-level scope
@ /tmp/example_targets.jl:13
[3] include
@ ./Base.jl:559 [inlined]
[4] exec_options(opts::Base.JLOptions)
@ Base ./client.jl:325
[5] _start()
@ Base ./client.jl:533
in expression starting at /tmp/example_targets.jl:13 |
Recording here so this isn't lost on slack. There's a ~27% increase in pkgimage size with this PR. master (via juliaup)
This PR built locally on MacOS with the same buildkite targets
|
That's not bad for being having efficient code for multiple platforms! This is definitely something we'll want for serving pkgimgs. |
There is a windows issue somehow :\ |
If there's no clear reason for the windows issue is it worth disabling on windows and merging this to get it tested? |
I'm not super confortable merging it because that windows issue doesn't seem to be simple. |
Great to have this improved but I agree with Mose that this is not clear:
Is an error returned if the user tries to make a package image for a totally different target than the base image? I don't fully understand this code but it seems that there is no check for that case. Would it be feasible to implement such a check? Otherwise this feels like a footgun. I could also update the docs here and here but I don't think that would be enough. |
@KristofferC why did you remove the backport-1.11 label without a comment? There's only a merge conflict in the tests, but it's trivial to fix it. I'm happy to push it to #56228 if that's ok for you. |
Sorry, I should have written something. It was discussed that this was too big of a thing to backport as late as it was in the release cycle. Now that it has been on master for a while, perhaps that can be reconsidered. |
Since backporting this PR would fix #56177, I'm inclined to do it. |
…rgeting only one (JuliaLang#54471) (cherry picked from commit ad407a6)
…rgeting only one (#54471) Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com> Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
…rgeting only one (#54471) Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com> Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
…rgeting only one (#54471) Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com> Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
Backported PRs: - [x] #55886 <!-- irrationals: restrict assume effects annotations to known types --> - [x] #55867 <!-- update `hash` doc string: `widen` not required any more --> - [x] #56084 <!-- slightly improve inference in precompilation code --> - [x] #56088 <!-- make `Base.ANSIIterator` have a concrete field --> - [x] #54093 <!-- Fix `JULIA_CPU_TARGET` being propagated to workers precompiling stdlib pkgimages --> - [x] #56165 <!-- Fix markdown list in installation.md --> - [x] #56148 <!-- Make loading work when stdlib deps are missing in the manifest --> - [x] #56174 <!-- Fix implicit `convert(String, ...)` in several places --> - [x] #56159 <!-- Add invalidation barriers for `displaysize` and `implicit_typeinfo` --> - [x] #56089 <!-- Call `MulAddMul` instead of multiplication in _generic_matmatmul! --> - [x] #56195 <!-- Include default user depot when JULIA_DEPOT_PATH has leading empty entry --> - [x] #56215 <!-- [REPL] fix lock ordering mistake in load_pkg --> - [x] #56251 <!-- REPL: run repl hint generation for modeswitch chars when not switching --> - [x] #56092 <!-- stream: fix reading LibuvStream into array --> - [x] #55870 <!-- fix infinite recursion in `promote_type` for `Irrational` --> - [x] #56227 <!-- Do not call `rand` during sysimage precompilation --> - [x] #55741 <!-- Change annotations to use a NamedTuple --> - [x] #56149 <!-- Specialize adding/subtracting mixed Upper/LowerTriangular --> - [x] #56214 <!-- fix precompile process flags --> - [x] #54471 - [x] #55622 - [x] #55704 - [x] #55764
Talking with @kpamnany. It would be good to have this in 1.10. It has been extensively tested in both master and 1.11 so I don't see a big issue |
Might this slow down 1.10 load/precompile speed? |
Precompile yes, since there is more work being done, but only when the user is actually requesting it. Loading should not be impacted. |
I haven't assembled a test for this just yet, but this works
Fixes #54464