Files

48 lines
2.2 KiB
Markdown
Raw Permalink Normal View History

# Implementation Spec: Round 21 — CPU Parallel Compute Primitives
## Goal
Fitur parallel khusus CPU (rayon) yang bounded, panic-isolated, error-aggregated.
Melengkapi `compute()` (single call) dengan batch parallel + fork-join.
## New API (crates/mytheclipse/src/compute.rs, feature `compute`)
### 1. `compute_map<I, T, F>(items, f) -> Result<Vec<T>, ComputeErrors>`
- `pack_items` di rayon compute pool: `par_iter().map(f)` — bounded concurrency
otomatis (rayon work-stealing sizing = CPU cores), ordered output.
- `f: Fn(I::Item) -> Result<T, ComputeMapItemError>`:
- item error string → dikumpulkan
- panic per item di-catch (catch_unwind) → jadi error, pool survive
- `ComputeErrors { errors: Vec<String> }` — Display, Error, len, is_empty.
(Tidak pakai AggregateError — feature `compute` harus compile tanpa resiliency.)
- `I: IntoParallelIterator` (rayon) — work langsung di pool, tanpa materialize.
### 2. `compute_join<A, B, RA, RB>(a, b) -> Result<(RA, RB), MytheclipseError>`
- `rayon::join` wrapper di compute pool: 2 heavy closures run parallel.
- Panic-isolated (catch_unwind per branch) — pool survive, error jadi
ComputePanic.
### 3. `compute_par_for_each<I>(items, f) -> Result<(), ComputeErrors>`
- `par_iter().for_each` idiom — fire side-effects parallel di pool.
- Panic isolation per item.
## Design notes
- Reuse `context().compute_pool` (existing sizing: compute_threads dari
RuntimeConfig / available_parallelism) — konsisten dengan `compute()`.
- `rayon::ThreadPool::install` untuk semua — force run di pool.
- Panic isolation: `std::panic::catch_unwind` + AssertUnwindSafe per item
(sama seperti `compute()` yang sudah proven).
- Bounded = rayon work-stealing — concurrency = pool threads (CPU cores),
bukan item count. Tidak perlu semaphore.
## Files
- crates/mytheclipse/src/compute.rs (3 fungsi + error type)
- crates/mytheclipse/src/lib.rs (export)
- doctests: compute_map, compute_join, compute_par_for_each
- tests: unit di compute.rs
## Verification
1. `cargo build --workspace --all-features` — exit 0
2. `cargo test -p mytheclipse compute --all-features` — 0 FAILED
3. `cargo test -p mytheclipse --doc --all-features` — 0 FAILED
4. `cargo clippy --workspace --all-features` — 0 new
5. spec + commit + push