bevy/crates
James Liu dfea88c64d Basic adaptive batching for parallel query iteration (#4777)
# Objective
Fixes #3184. Fixes #6640. Fixes #4798. Using `Query::par_for_each(_mut)` currently requires a `batch_size` parameter, which affects how it chunks up large archetypes and tables into smaller chunks to run in parallel. Tuning this value is difficult, as the performance characteristics entirely depends on the state of the `World` it's being run on. Typically, users will just use a flat constant and just tune it by hand until it performs well in some benchmarks. However, this is both error prone and risks overfitting the tuning on that benchmark.

This PR proposes a naive automatic batch-size computation based on the current state of the `World`.

## Background
`Query::par_for_each(_mut)` schedules a new Task for every archetype or table that it matches. Archetypes/tables larger than the batch size are chunked into smaller tasks. Assuming every entity matched by the query has an identical workload, this makes the worst case scenario involve using a batch size equal to the size of the largest matched archetype or table. Conversely, a batch size of `max {archetype, table} size / thread count * COUNT_PER_THREAD` is likely the sweetspot where the overhead of scheduling tasks is minimized, at least not without grouping small archetypes/tables together.

There is also likely a strict minimum batch size below which the overhead of scheduling these tasks is heavier than running the entire thing single-threaded.

## Solution

- [x] Remove the `batch_size` from `Query(State)::par_for_each`  and friends.
- [x] Add a check to compute `batch_size = max {archeytpe/table} size / thread count  * COUNT_PER_THREAD`
- [x] ~~Panic if thread count is 0.~~ Defer to `for_each` if the thread count is 1 or less.
- [x] Early return if there is no matched table/archetype. 
- [x] Add override option for users have queries that strongly violate the initial assumption that all iterated entities have an equal workload.

---

## Changelog
Changed: `Query::par_for_each(_mut)` has been changed to `Query::par_iter(_mut)` and will now automatically try to produce a batch size for callers based on the current `World` state.

## Migration Guide
The `batch_size` parameter for `Query(State)::par_for_each(_mut)` has been removed. These calls will automatically compute a batch size for you. Remove these parameters from all calls to these functions.

Before:
```rust
fn parallel_system(query: Query<&MyComponent>) {
   query.par_for_each(32, |comp| {
        ...
   });
}
```

After:

```rust
fn parallel_system(query: Query<&MyComponent>) {
   query.par_iter().for_each(|comp| {
        ...
   });
}
```

Co-authored-by: Arnav Choubey <56453634+x-52@users.noreply.github.com>
Co-authored-by: Robert Swain <robert.swain@gmail.com>
Co-authored-by: François <mockersf@gmail.com>
Co-authored-by: Corey Farwell <coreyf@rwell.org>
Co-authored-by: Aevyrie <aevyrie@gmail.com>
2023-01-20 08:47:20 +00:00
..
bevy_animation Basic adaptive batching for parallel query iteration (#4777) 2023-01-20 08:47:20 +00:00
bevy_app Pipelined Rendering (#6503) 2023-01-19 23:45:46 +00:00
bevy_asset fix load_internal_binary_asset with debug_asset_server (#7246) 2023-01-18 02:07:26 +00:00
bevy_audio AudioOutput is actually a normal resource now, not a non-send resource (#7262) 2023-01-18 17:20:26 +00:00
bevy_core Break CorePlugin into TaskPoolPlugin, TypeRegistrationPlugin, FrameCountPlugin. (#7083) 2023-01-05 11:42:35 +00:00
bevy_core_pipeline Add depth and normal prepass (#6284) 2023-01-19 22:11:13 +00:00
bevy_derive Fix ndk-macro link (#7027) 2022-12-25 05:06:03 +00:00
bevy_diagnostic Fix various typos (#7096) 2023-01-06 00:43:30 +00:00
bevy_dylib Release 0.9.0 (#6568) 2022-11-12 20:01:29 +00:00
bevy_dynamic_plugin Adapt path type of dynamically_load_plugin (#6734) 2022-12-05 23:39:43 +00:00
bevy_ecs Basic adaptive batching for parallel query iteration (#4777) 2023-01-20 08:47:20 +00:00
bevy_ecs_compile_fail_tests Fix clippy lints and failed test with Rust 1.66 (#6945) 2022-12-15 18:05:15 +00:00
bevy_encase_derive add helper for macro to get either bevy::x or bevy_x depending on how it was imported (#7164) 2023-01-11 21:12:02 +00:00
bevy_gilrs Gamepad events refactor (#6965) 2023-01-09 19:24:52 +00:00
bevy_gltf enum Visibility component (#6320) 2022-12-25 00:39:29 +00:00
bevy_hierarchy Add ReplaceChildren and ClearChildren EntityCommands (#6035) 2023-01-16 21:24:15 +00:00
bevy_input Fix incorrect behavior of just_pressed and just_released in Input<GamepadButton> (#7238) 2023-01-16 21:09:24 +00:00
bevy_internal Pipelined Rendering (#6503) 2023-01-19 23:45:46 +00:00
bevy_log Fix suppression of all console logs when trace_tracy is enabled (#6955) 2022-12-20 23:45:43 +00:00
bevy_macro_utils Add bevy_ecs::schedule_v3 module (#6587) 2023-01-17 01:39:17 +00:00
bevy_math Improve code/comments for Ray::intersect_plane and its tests (#6823) 2022-12-05 22:49:06 +00:00
bevy_mikktspace Release 0.9.0 (#6568) 2022-11-12 20:01:29 +00:00
bevy_pbr Add depth and normal prepass (#6284) 2023-01-19 22:11:13 +00:00
bevy_ptr Improve safety for CommandQueue internals (#7039) 2023-01-19 03:04:39 +00:00
bevy_reflect bevy_reflect: Add simple enum support to reflection paths (#6560) 2023-01-11 16:46:27 +00:00
bevy_reflect_compile_fail_tests bevy_reflect: Add compile fail tests for bevy_reflect (#7041) 2023-01-02 21:07:33 +00:00
bevy_render Basic adaptive batching for parallel query iteration (#4777) 2023-01-20 08:47:20 +00:00
bevy_scene Fix beta clippy lints (#7154) 2023-01-11 09:51:22 +00:00
bevy_sprite Remove VerticalAlign from TextAlignment (#6807) 2023-01-18 02:19:17 +00:00
bevy_tasks Pipelined Rendering (#6503) 2023-01-19 23:45:46 +00:00
bevy_text Windows as Entities (#5589) 2023-01-19 00:38:28 +00:00
bevy_time Add bevy_ecs::schedule_v3 module (#6587) 2023-01-17 01:39:17 +00:00
bevy_transform Basic adaptive batching for parallel query iteration (#4777) 2023-01-20 08:47:20 +00:00
bevy_ui remove the image loaded check for nodes without images in extract_uinodes (#7280) 2023-01-20 01:05:30 +00:00
bevy_utils Add bevy_ecs::schedule_v3 module (#6587) 2023-01-17 01:39:17 +00:00
bevy_window Remove unnecessary windows.rs file (#7277) 2023-01-19 06:05:39 +00:00
bevy_winit Windows as Entities (#5589) 2023-01-19 00:38:28 +00:00