-
-
Notifications
You must be signed in to change notification settings - Fork 3.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use explicitly added
ApplyDeferred
stages when computing automatica…
…lly inserted sync points. (#16782) # Objective - The previous implementation of automatically inserting sync points did not consider explicitly added sync points. This created additional sync points. For example: ``` A-B C-D-E ``` If `A` and `B` needed a sync point, and `D` was an `ApplyDeferred`, an additional sync point would be generated between `A` and `B`. ``` A-D2-B C-D -E ``` This can result in the following system ordering: ``` A-D2-(B-C)-D-E ``` Where only `B` and `C` run in parallel. If we could reuse `D` as the sync point, we would get the following ordering: ``` (A-C)-D-(B-E) ``` Now we have two more opportunities for parallelism! ## Solution - In the first pass, we: - Compute the number of sync points before each node - This was already happening but now we consider `ApplyDeferred` nodes as creating a sync point. - Pick an arbitrary explicit `ApplyDeferred` node for each "sync point index" that we can (some required sync points may be missing!) - In the second pass, we: - For each edge, if two nodes have a different number of sync points before them then there must be a sync point between them. - Look for an explicit `ApplyDeferred`. If one exists, use it as the sync point. - Otherwise, generate a new sync point. I believe this should also gracefully handle changes to the `ScheduleGraph`. Since automatically inserted sync points are inserted as systems, they won't look any different to explicit sync points, so they are also candidates for "reusing" sync points. One thing this solution does not handle is "deduping" sync points. If you add 10 sync points explicitly, there will be at least 10 sync points. You could keep track of all the sync points at the same "distance" and then hack apart the graph to dedup those, but that could be a follow-up step (and it's more complicated since you have to worry about transferring edges between nodes). ## Testing - Added a test to test the feature. - The existing tests from all our crates still pass. ## Showcase - Automatically inserted sync points can now reuse explicitly inserted `ApplyDeferred` systems! Previously, Bevy would add new sync points between systems, ignoring the explicitly added sync points. This would reduce parallelism of systems in some situations. Now, the parallelism has been improved!
- Loading branch information
Showing
2 changed files
with
214 additions
and
24 deletions.
There are no files selected for viewing
This file contains 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
This file contains 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