Create simulator interface which provides thread scheduling + speculative fetching
Rather than having each simulator figure out how to schedule traced software threads onto simulated cores in their own ad hoc way, we would like to provide a scheduler service, which should result in several benefits:
- Ease of use: a new simulator use case has one less thing to implement
- Consistency: all simulators can now use the same approach
- Fill in gaps in trace-based simulation:
- We can re-schedule threads even when simulating the recorded hardware to deflate context switches increased by tracing overhead
- We can more easily combine multiple single-workload traces
- We can provide speculative path fetching using various schemes (from heuristics to additional data recorded during tracing) to help bridge the gap with execution-driven simulation
Xref #5694: provide per-core iterator. That may become subsumed by this new broader-scope feature.