tinyasm: avoid copying the block dofmap in BlockJacobi::solve() - #5348
Draft
manishpaulish wants to merge 1 commit into
Draft
tinyasm: avoid copying the block dofmap in BlockJacobi::solve()#5348manishpaulish wants to merge 1 commit into
manishpaulish wants to merge 1 commit into
Conversation
dofsPerBlock is a vector<vector<PetscInt>>, so `auto dofmap = dofsPerBlock[p]` deduces by value and heap-allocates + copies the block's dofmap on every block, on every application of the preconditioner. solve() runs once per Krylov iteration and block counts are typically in the thousands, so this is on the order of a million small allocations per linear solve. Bind by const reference instead. No behavioural change: dofmap is only read. A standalone microbenchmark mirroring the loop structure (20k blocks, dof in [4,20], 50 applications, -O2) measures the copy at 11-13% of solve() runtime.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
dofsPerBlockis avector<vector<PetscInt>>, soauto dofmap = dofsPerBlock[p];deduces by value and heap-allocates plus copies the block's dofmap on every block, on every application of the preconditioner.
solve()runs once per Krylov iteration and block counts are typically in the thousands, so this is on the order of a million small allocations per linear solve.Binding by const reference instead. No behavioural change,
dofmapis only read.A standalone microbenchmark mirroring the loop structure (20k blocks, dof in [4, 20], 50 applications,
-O2) puts the copy at 11 to 13 percent ofsolve()runtime, consistent across runs. That is a microbenchmark rather than a real solve, so treat the exact figure as indicative, but the mechanism is straightforward enough.