Improve performance with sparse Jacobians #4037
Open
+26
−18
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I noticed two things when profiling with sparse+analytical Jacobians generated by MTK in my package:
ODEProblem(...; jac = true, sparse = true)is spent inside thisiszerocheck:solveis slowed by this sparsity pattern check every time the analytically generated Jacobian function is called:I suggest two changes:
iszeroaltogether. It is used when nonzeros of W are explicitly stored in J. But this can be done equivalently by recreating the sparse Jacobian in(I, J, V)-form with explicit zeros added at all of W's nonzero entries.checkbounds = true. I am sure there are also other ways to solve this.With these changes, the respective sections of the flamegraph disappear and the timings improve:
to
Checklist
contributor guidelines, in particular the SciML Style Guide and
COLPRAC.