Precompilation - #487
Conversation
ce58308 to
f6b5b49
Compare
Codecov Report❌ Patch coverage is
... and 1 file with indirect coverage changes 🚀 New features to boost your workflow:
|
Add `src/precompile.jl`: a default-on `@compile_workload` that runs representative contractions, traces and permutations for `Trivial`, `Z2Irrep`, `SU2Irrep` and `FermionParity` over `Float64`/`ComplexF64` and arities [2,3,4]. The heavy kernels (tree transformers, `add_transform!`, per-block BLAS `mul!`) are sector-agnostic, so this also speeds up the first contraction of other symmetries -- including user-defined ones. The exported `precompile_contract(V; eltypes, ndims)` helper is the reusable unit; downstream packages can call it for their own symmetry inside their own `@compile_workload`. The workload is tunable/disable-able through Preferences (`precompile_workload`, `precompile_eltypes`, `precompile_sectors`, `precompile_ndims`), mirroring TensorOperations. Also move `_repartition_body` above the `@generated repartition` that calls it at generation time: the workload is the first code to trigger `repartition` at precompile time, which exposed a latent world-age ordering bug (`UndefVarError` that runtime masks via a later world age). Adds PrecompileTools and Preferences dependencies. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
@borisdevos I'd be very interested in any timing results you have for the MPSKit testsuite on main TensorKit vs on this branch, in case you were already investigating |
|
https://quantumkithub.github.io/TensorKit.jl/previews/PR487/man/precompilation/ for the relevant docs preview. Completely unrelated to this PR, but I noticed in the docs that the contents of tensors only show the first page, namely "Constructing tensors and the Besides that, with my one data point on the MPSKit tests, it seems this precompilation is useful, but my machine is so garbage that there's lots of noise, so I'm testing some of the heavier compilation files more. |
|
|
||
| ```julia | ||
| @compile_workload begin | ||
| TensorKit.precompile_contract(Vect[MySector]) |
There was a problem hiding this comment.
| TensorKit.precompile_contract(Vect[MySector]) | |
| TensorKit.Precompilation.precompile_contract(Vect[MySector]) |
I think? Same for the other 2 docstrings.
There was a problem hiding this comment.
they are actually exported from the precompilation module, so this is not required.
This PR adds a precompilation suite to TensorKit.
It takes about 300 seconds on my machine, and is enabled by default.
Given the general migration of the ecosystem towards more heavy precompilation workflows, I think this is warranted, and I'm hoping this improves our CI times as well as the general user experiences.
I've also structured it in such a way that you could conceivably reuse this locally for projects with specific symmetry needs, to ensure faster startup times.
As in general TensorKit is not updated all that often, I hope this is not something that has to be retriggered too much, therefore I felt the ~5mins of precompilation time to be reasonable.