-
Notifications
You must be signed in to change notification settings - Fork 597
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
Share ChildBinding objects between siblings #4238
Conversation
I validated that the ChildBinding objects are not currently shared and that with this change they are now shared with the Eclipse MemoryAnalyzer (https://eclipse.dev/mat/). This changed the measured memory use per UInt child of the Bundles in my example above from 72 bytes shallow, 144 retained to 72 bytes shallow, 128 retained, which measures my expectation. I'm also impressed that MAT is able to figure out that the individual elements should not be dinged for retaining the object that they all share. |
(cherry picked from commit d499a88)
I figured out how to benchmark a little bit better by avoiding serialization import chisel3._
// _root_ disambiguates from package chisel3.util.circt if user imports chisel3.util._
import _root_.circt.stage.ChiselStage
class MyBundle extends Bundle {
val a, b, c, d, e, f, g = UInt(8.W)
}
class Foo(n: Int) extends Module {
val in = IO(Input(Vec(n, new MyBundle)))
val out = IO(Output(Vec(n, new MyBundle)))
out :#= in
}
object Main extends App {
val n = args(0).toInt
val phase = new chisel3.stage.phases.Elaborate
val annos = Seq(
chisel3.stage.ChiselGeneratorAnnotation(() => new Foo(n))
)
println(phase.transform(annos).size)
} Using the same basic approach but smaller min-step and more context:
Without this change:
With this change:
Using the best Max RSS for each shows a memory reduction of 2.8%. Small, but measurable! |
It's hard to measure the benefit from this, but I used the following little snippet of Chisel to make a bundle of Bundles:
Then I built a fat assembly jar with Mill, and checked the heap size with
find_heap_bound
:With this, I measured a ~2.5% memory reduction for this very Bundle-heavy code.
I had thought about a more aggressive change, where
ChildBinding
becomes acase object
and we instead get theparent
fromref
(which does duplicate this information). However, using the above benchmark, I measured the exact same memory improvement. Since I cannot measure any benefit from the much more aggressive and hacky alternative approach, I think we should do the simpler thing which gets more-or-less the same benefit.Contributor Checklist
docs/src
?Type of Improvement
Desired Merge Strategy
Release Notes
This reduces memory use by
n - 1
times 16-bytes for an Aggregate withn
elements.Reviewer Checklist (only modified by reviewer)
3.6.x
,5.x
, or6.x
depending on impact, API modification or big change:7.0
)?Enable auto-merge (squash)
, clean up the commit message, and label withPlease Merge
.Create a merge commit
.