832 lines
31 KiB
Markdown
832 lines
31 KiB
Markdown
|
# Release rayon 1.6.0 / rayon-core 1.10.0 (2022-11-18)
|
||
|
|
||
|
- The minimum supported `rustc` is now 1.56.
|
||
|
- The new `IndexedParallelIterator::fold_chunks` and `fold_chunks_with` methods
|
||
|
work like `ParallelIterator::fold` and `fold_with` with fixed-size chunks of
|
||
|
items. This may be useful for predictable batching performance, without the
|
||
|
allocation overhead of `IndexedParallelIterator::chunks`.
|
||
|
- New "broadcast" methods run a given function on all threads in the pool.
|
||
|
These run at a sort of reduced priority after each thread has exhausted their
|
||
|
local work queue, but before they attempt work-stealing from other threads.
|
||
|
- The global `broadcast` function and `ThreadPool::broadcast` method will
|
||
|
block until completion, returning a `Vec` of all return values.
|
||
|
- The global `spawn_broadcast` function and methods on `ThreadPool`, `Scope`,
|
||
|
and `ScopeFifo` will run detached, without blocking the current thread.
|
||
|
- Panicking methods now use `#[track_caller]` to report the caller's location.
|
||
|
- Fixed a truncated length in `vec::Drain` when given an empty range.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @cuviper
|
||
|
- @idanmuze
|
||
|
- @JoeyBF
|
||
|
- @JustForFun88
|
||
|
- @kianmeng
|
||
|
- @kornelski
|
||
|
- @ritchie46
|
||
|
- @ryanrussell
|
||
|
- @steffahn
|
||
|
- @TheIronBorn
|
||
|
- @willcrozi
|
||
|
|
||
|
# Release rayon 1.5.3 (2022-05-13)
|
||
|
|
||
|
- The new `ParallelSliceMut::par_sort_by_cached_key` is a stable sort that caches
|
||
|
the keys for each item -- a parallel version of `slice::sort_by_cached_key`.
|
||
|
|
||
|
# Release rayon-core 1.9.3 (2022-05-13)
|
||
|
|
||
|
- Fixed a use-after-free race in job notification.
|
||
|
|
||
|
# Release rayon 1.5.2 / rayon-core 1.9.2 (2022-04-13)
|
||
|
|
||
|
- The new `ParallelSlice::par_rchunks()` and `par_rchunks_exact()` iterate
|
||
|
slice chunks in reverse, aligned the against the end of the slice if the
|
||
|
length is not a perfect multiple of the chunk size. The new
|
||
|
`ParallelSliceMut::par_rchunks_mut()` and `par_rchunks_exact_mut()` are the
|
||
|
same for mutable slices.
|
||
|
- The `ParallelIterator::try_*` methods now support `std::ops::ControlFlow` and
|
||
|
`std::task::Poll` items, mirroring the unstable `Try` implementations in the
|
||
|
standard library.
|
||
|
- The `ParallelString` pattern-based methods now support `&[char]` patterns,
|
||
|
which match when any character in that slice is found in the string.
|
||
|
- A soft limit is now enforced on the number of threads allowed in a single
|
||
|
thread pool, respecting internal bit limits that already existed. The current
|
||
|
maximum is publicly available from the new function `max_num_threads()`.
|
||
|
- Fixed several Stacked Borrow and provenance issues found by `cargo miri`.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @atouchet
|
||
|
- @bluss
|
||
|
- @cuviper
|
||
|
- @fzyzcjy
|
||
|
- @nyanzebra
|
||
|
- @paolobarbolini
|
||
|
- @RReverser
|
||
|
- @saethlin
|
||
|
|
||
|
# Release rayon 1.5.1 / rayon-core 1.9.1 (2021-05-18)
|
||
|
|
||
|
- The new `in_place_scope` and `in_place_scope_fifo` are variations of `scope`
|
||
|
and `scope_fifo`, running the initial non-`Send` callback directly on the
|
||
|
current thread, rather than moving execution to the thread pool.
|
||
|
- With Rust 1.51 or later, arrays now implement `IntoParallelIterator`.
|
||
|
- New implementations of `FromParallelIterator` make it possible to `collect`
|
||
|
complicated nestings of items.
|
||
|
- `FromParallelIterator<(A, B)> for (FromA, FromB)` works like `unzip`.
|
||
|
- `FromParallelIterator<Either<L, R>> for (A, B)` works like `partition_map`.
|
||
|
- Type inference now works better with parallel `Range` and `RangeInclusive`.
|
||
|
- The implementation of `FromParallelIterator` and `ParallelExtend` for
|
||
|
`Vec<T>` now uses `MaybeUninit<T>` internally to avoid creating any
|
||
|
references to uninitialized data.
|
||
|
- `ParallelBridge` fixed a bug with threads missing available work.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @atouchet
|
||
|
- @cuviper
|
||
|
- @Hywan
|
||
|
- @iRaiko
|
||
|
- @Qwaz
|
||
|
- @rocallahan
|
||
|
|
||
|
# Release rayon 1.5.0 / rayon-core 1.9.0 (2020-10-21)
|
||
|
|
||
|
- Update crossbeam dependencies.
|
||
|
- The minimum supported `rustc` is now 1.36.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @cuviper
|
||
|
- @mbrubeck
|
||
|
- @mrksu
|
||
|
|
||
|
# Release rayon 1.4.1 (2020-09-29)
|
||
|
|
||
|
- The new `flat_map_iter` and `flatten_iter` methods can be used to flatten
|
||
|
sequential iterators, which may perform better in cases that don't need the
|
||
|
nested parallelism of `flat_map` and `flatten`.
|
||
|
- The new `par_drain` method is a parallel version of the standard `drain` for
|
||
|
collections, removing items while keeping the original capacity. Collections
|
||
|
that implement this through `ParallelDrainRange` support draining items from
|
||
|
arbitrary index ranges, while `ParallelDrainFull` always drains everything.
|
||
|
- The new `positions` method finds all items that match the given predicate and
|
||
|
returns their indices in a new iterator.
|
||
|
|
||
|
# Release rayon-core 1.8.1 (2020-09-17)
|
||
|
|
||
|
- Fixed an overflow panic on high-contention workloads, for a counter that was
|
||
|
meant to simply wrap. This panic only occurred with debug assertions enabled,
|
||
|
and was much more likely on 32-bit targets.
|
||
|
|
||
|
# Release rayon 1.4.0 / rayon-core 1.8.0 (2020-08-24)
|
||
|
|
||
|
- Implemented a new thread scheduler, [RFC 5], which uses targeted wakeups for
|
||
|
new work and for notifications of completed stolen work, reducing wasteful
|
||
|
CPU usage in idle threads.
|
||
|
- Implemented `IntoParallelIterator for Range<char>` and `RangeInclusive<char>`
|
||
|
with the same iteration semantics as Rust 1.45.
|
||
|
- Relaxed the lifetime requirements of the initial `scope` closure.
|
||
|
|
||
|
[RFC 5]: https://github.com/rayon-rs/rfcs/pull/5
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @CAD97
|
||
|
- @cuviper
|
||
|
- @kmaork
|
||
|
- @nikomatsakis
|
||
|
- @SuperFluffy
|
||
|
|
||
|
|
||
|
# Release rayon 1.3.1 / rayon-core 1.7.1 (2020-06-15)
|
||
|
|
||
|
- Fixed a use-after-free race in calls blocked between two rayon thread pools.
|
||
|
- Collecting to an indexed `Vec` now drops any partial writes while unwinding,
|
||
|
rather than just leaking them. If dropping also panics, Rust will abort.
|
||
|
- Note: the old leaking behavior is considered _safe_, just not ideal.
|
||
|
- The new `IndexedParallelIterator::step_by()` adapts an iterator to step
|
||
|
through items by the given count, like `Iterator::step_by()`.
|
||
|
- The new `ParallelSlice::par_chunks_exact()` and mutable equivalent
|
||
|
`ParallelSliceMut::par_chunks_exact_mut()` ensure that the chunks always have
|
||
|
the exact length requested, leaving any remainder separate, like the slice
|
||
|
methods `chunks_exact()` and `chunks_exact_mut()`.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @adrian5
|
||
|
- @bluss
|
||
|
- @cuviper
|
||
|
- @FlyingCanoe
|
||
|
- @GuillaumeGomez
|
||
|
- @matthiasbeyer
|
||
|
- @picoHz
|
||
|
- @zesterer
|
||
|
|
||
|
|
||
|
# Release rayon 1.3.0 / rayon-core 1.7.0 (2019-12-21)
|
||
|
|
||
|
- Tuples up to length 12 now implement `IntoParallelIterator`, creating a
|
||
|
`MultiZip` iterator that produces items as similarly-shaped tuples.
|
||
|
- The `--cfg=rayon_unstable` supporting code for `rayon-futures` is removed.
|
||
|
- The minimum supported `rustc` is now 1.31.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @cuviper
|
||
|
- @c410-f3r
|
||
|
- @silwol
|
||
|
|
||
|
|
||
|
# Release rayon-futures 0.1.1 (2019-12-21)
|
||
|
|
||
|
- `Send` bounds have been added for the `Item` and `Error` associated types on
|
||
|
all generic `F: Future` interfaces. While technically a breaking change, this
|
||
|
is a soundness fix, so we are not increasing the semantic version for this.
|
||
|
- This crate is now deprecated, and the `--cfg=rayon_unstable` supporting code
|
||
|
will be removed in `rayon-core 1.7.0`. This only supported the now-obsolete
|
||
|
`Future` from `futures 0.1`, while support for `std::future::Future` is
|
||
|
expected to come directly in `rayon-core` -- although that is not ready yet.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @cuviper
|
||
|
- @kornelski
|
||
|
- @jClaireCodesStuff
|
||
|
- @jwass
|
||
|
- @seanchen1991
|
||
|
|
||
|
|
||
|
# Release rayon 1.2.1 / rayon-core 1.6.1 (2019-11-20)
|
||
|
|
||
|
- Update crossbeam dependencies.
|
||
|
- Add top-level doc links for the iterator traits.
|
||
|
- Document that the iterator traits are not object safe.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @cuviper
|
||
|
- @dnaka91
|
||
|
- @matklad
|
||
|
- @nikomatsakis
|
||
|
- @Qqwy
|
||
|
- @vorner
|
||
|
|
||
|
|
||
|
# Release rayon 1.2.0 / rayon-core 1.6.0 (2019-08-30)
|
||
|
|
||
|
- The new `ParallelIterator::copied()` converts an iterator of references into
|
||
|
copied values, like `Iterator::copied()`.
|
||
|
- `ParallelExtend` is now implemented for the unit `()`.
|
||
|
- Internal updates were made to improve test determinism, reduce closure type
|
||
|
sizes, reduce task allocations, and update dependencies.
|
||
|
- The minimum supported `rustc` is now 1.28.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @Aaron1011
|
||
|
- @cuviper
|
||
|
- @ralfbiedert
|
||
|
|
||
|
|
||
|
# Release rayon 1.1.0 / rayon-core 1.5.0 (2019-06-12)
|
||
|
|
||
|
- FIFO spawns are now supported using the new `spawn_fifo()` and `scope_fifo()`
|
||
|
global functions, and their corresponding `ThreadPool` methods.
|
||
|
- Normally when tasks are queued on a thread, the most recent is processed
|
||
|
first (LIFO) while other threads will steal the oldest (FIFO). With FIFO
|
||
|
spawns, those tasks are processed locally in FIFO order too.
|
||
|
- Regular spawns and other tasks like `join` are not affected.
|
||
|
- The `breadth_first` configuration flag, which globally approximated this
|
||
|
effect, is now deprecated.
|
||
|
- For more design details, please see [RFC 1].
|
||
|
- `ThreadPoolBuilder` can now take a custom `spawn_handler` to control how
|
||
|
threads will be created in the pool.
|
||
|
- `ThreadPoolBuilder::build_scoped()` uses this to create a scoped thread
|
||
|
pool, where the threads are able to use non-static data.
|
||
|
- This may also be used to support threading in exotic environments, like
|
||
|
WebAssembly, which don't support the normal `std::thread`.
|
||
|
- `ParallelIterator` has 3 new methods: `find_map_any()`, `find_map_first()`,
|
||
|
and `find_map_last()`, like `Iterator::find_map()` with ordering constraints.
|
||
|
- The new `ParallelIterator::panic_fuse()` makes a parallel iterator halt as soon
|
||
|
as possible if any of its threads panic. Otherwise, the panic state is not
|
||
|
usually noticed until the iterator joins its parallel tasks back together.
|
||
|
- `IntoParallelIterator` is now implemented for integral `RangeInclusive`.
|
||
|
- Several internal `Folder`s now have optimized `consume_iter` implementations.
|
||
|
- `rayon_core::current_thread_index()` is now re-exported in `rayon`.
|
||
|
- The minimum `rustc` is now 1.26, following the update policy defined in [RFC 3].
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @cuviper
|
||
|
- @didroe
|
||
|
- @GuillaumeGomez
|
||
|
- @huonw
|
||
|
- @janriemer
|
||
|
- @kornelski
|
||
|
- @nikomatsakis
|
||
|
- @seanchen1991
|
||
|
- @yegeun542
|
||
|
|
||
|
[RFC 1]: https://github.com/rayon-rs/rfcs/blob/master/accepted/rfc0001-scope-scheduling.md
|
||
|
[RFC 3]: https://github.com/rayon-rs/rfcs/blob/master/accepted/rfc0003-minimum-rustc.md
|
||
|
|
||
|
|
||
|
# Release rayon 1.0.3 (2018-11-02)
|
||
|
|
||
|
- `ParallelExtend` is now implemented for tuple pairs, enabling nested
|
||
|
`unzip()` and `partition_map()` operations. For instance, `(A, (B, C))`
|
||
|
items can be unzipped into `(Vec<A>, (Vec<B>, Vec<C>))`.
|
||
|
- `ParallelExtend<(A, B)>` works like `unzip()`.
|
||
|
- `ParallelExtend<Either<A, B>>` works like `partition_map()`.
|
||
|
- `ParallelIterator` now has a method `map_init()` which calls an `init`
|
||
|
function for a value to pair with items, like `map_with()` but dynamically
|
||
|
constructed. That value type has no constraints, not even `Send` or `Sync`.
|
||
|
- The new `for_each_init()` is a variant of this for simple iteration.
|
||
|
- The new `try_for_each_init()` is a variant for fallible iteration.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @cuviper
|
||
|
- @dan-zheng
|
||
|
- @dholbert
|
||
|
- @ignatenkobrain
|
||
|
- @mdonoughe
|
||
|
|
||
|
|
||
|
# Release rayon 1.0.2 / rayon-core 1.4.1 (2018-07-17)
|
||
|
|
||
|
- The `ParallelBridge` trait with method `par_bridge()` makes it possible to
|
||
|
use any `Send`able `Iterator` in parallel!
|
||
|
- This trait has been added to `rayon::prelude`.
|
||
|
- It automatically implements internal synchronization and queueing to
|
||
|
spread the `Item`s across the thread pool. Iteration order is not
|
||
|
preserved by this adaptor.
|
||
|
- "Native" Rayon iterators like `par_iter()` should still be preferred when
|
||
|
possible for better efficiency.
|
||
|
- `ParallelString` now has additional methods for parity with `std` string
|
||
|
iterators: `par_char_indices()`, `par_bytes()`, `par_encode_utf16()`,
|
||
|
`par_matches()`, and `par_match_indices()`.
|
||
|
- `ParallelIterator` now has fallible methods `try_fold()`, `try_reduce()`,
|
||
|
and `try_for_each`, plus `*_with()` variants of each, for automatically
|
||
|
short-circuiting iterators on `None` or `Err` values. These are inspired by
|
||
|
`Iterator::try_fold()` and `try_for_each()` that were stabilized in Rust 1.27.
|
||
|
- `Range<i128>` and `Range<u128>` are now supported with Rust 1.26 and later.
|
||
|
- Small improvements have been made to the documentation.
|
||
|
- `rayon-core` now only depends on `rand` for testing.
|
||
|
- Rayon tests now work on stable Rust.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @AndyGauge
|
||
|
- @cuviper
|
||
|
- @ignatenkobrain
|
||
|
- @LukasKalbertodt
|
||
|
- @MajorBreakfast
|
||
|
- @nikomatsakis
|
||
|
- @paulkernfeld
|
||
|
- @QuietMisdreavus
|
||
|
|
||
|
|
||
|
# Release rayon 1.0.1 (2018-03-16)
|
||
|
|
||
|
- Added more documentation for `rayon::iter::split()`.
|
||
|
- Corrected links and typos in documentation.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @cuviper
|
||
|
- @HadrienG2
|
||
|
- @matthiasbeyer
|
||
|
- @nikomatsakis
|
||
|
|
||
|
|
||
|
# Release rayon 1.0.0 / rayon-core 1.4.0 (2018-02-15)
|
||
|
|
||
|
- `ParallelIterator` added the `update` method which applies a function to
|
||
|
mutable references, inspired by `itertools`.
|
||
|
- `IndexedParallelIterator` added the `chunks` method which yields vectors of
|
||
|
consecutive items from the base iterator, inspired by `itertools`.
|
||
|
- `String` now implements `FromParallelIterator<Cow<str>>` and
|
||
|
`ParallelExtend<Cow<str>>`, inspired by `std`.
|
||
|
- `()` now implements `FromParallelIterator<()>`, inspired by `std`.
|
||
|
- The new `ThreadPoolBuilder` replaces and deprecates `Configuration`.
|
||
|
- Errors from initialization now have the concrete `ThreadPoolBuildError`
|
||
|
type, rather than `Box<Error>`, and this type implements `Send` and `Sync`.
|
||
|
- `ThreadPool::new` is deprecated in favor of `ThreadPoolBuilder::build`.
|
||
|
- `initialize` is deprecated in favor of `ThreadPoolBuilder::build_global`.
|
||
|
- Examples have been added to most of the parallel iterator methods.
|
||
|
- A lot of the documentation has been reorganized and extended.
|
||
|
|
||
|
## Breaking changes
|
||
|
|
||
|
- Rayon now requires rustc 1.13 or greater.
|
||
|
- `IndexedParallelIterator::len` and `ParallelIterator::opt_len` now operate on
|
||
|
`&self` instead of `&mut self`.
|
||
|
- `IndexedParallelIterator::collect_into` is now `collect_into_vec`.
|
||
|
- `IndexedParallelIterator::unzip_into` is now `unzip_into_vecs`.
|
||
|
- Rayon no longer exports the deprecated `Configuration` and `initialize` from
|
||
|
rayon-core.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @Bilkow
|
||
|
- @cuviper
|
||
|
- @Enet4
|
||
|
- @ignatenkobrain
|
||
|
- @iwillspeak
|
||
|
- @jeehoonkang
|
||
|
- @jwass
|
||
|
- @Kerollmops
|
||
|
- @KodrAus
|
||
|
- @kornelski
|
||
|
- @MaloJaffre
|
||
|
- @nikomatsakis
|
||
|
- @obv-mikhail
|
||
|
- @oddg
|
||
|
- @phimuemue
|
||
|
- @stjepang
|
||
|
- @tmccombs
|
||
|
- bors[bot]
|
||
|
|
||
|
|
||
|
# Release rayon 0.9.0 / rayon-core 1.3.0 / rayon-futures 0.1.0 (2017-11-09)
|
||
|
|
||
|
- `Configuration` now has a `build` method.
|
||
|
- `ParallelIterator` added `flatten` and `intersperse`, both inspired by
|
||
|
itertools.
|
||
|
- `IndexedParallelIterator` added `interleave`, `interleave_shortest`, and
|
||
|
`zip_eq`, all inspired by itertools.
|
||
|
- The new functions `iter::empty` and `once` create parallel iterators of
|
||
|
exactly zero or one item, like their `std` counterparts.
|
||
|
- The new functions `iter::repeat` and `repeatn` create parallel iterators
|
||
|
repeating an item indefinitely or `n` times, respectively.
|
||
|
- The new function `join_context` works like `join`, with an added `FnContext`
|
||
|
parameter that indicates whether the job was stolen.
|
||
|
- `Either` (used by `ParallelIterator::partition_map`) is now re-exported from
|
||
|
the `either` crate, instead of defining our own type.
|
||
|
- `Either` also now implements `ParallelIterator`, `IndexedParallelIterator`,
|
||
|
and `ParallelExtend` when both of its `Left` and `Right` types do.
|
||
|
- All public types now implement `Debug`.
|
||
|
- Many of the parallel iterators now implement `Clone` where possible.
|
||
|
- Much of the documentation has been extended. (but still could use more help!)
|
||
|
- All rayon crates have improved metadata.
|
||
|
- Rayon was evaluated in the Libz Blitz, leading to many of these improvements.
|
||
|
- Rayon pull requests are now guarded by bors-ng.
|
||
|
|
||
|
## Futures
|
||
|
|
||
|
The `spawn_future()` method has been refactored into its own `rayon-futures`
|
||
|
crate, now through a `ScopeFutureExt` trait for `ThreadPool` and `Scope`. The
|
||
|
supporting `rayon-core` APIs are still gated by `--cfg rayon_unstable`.
|
||
|
|
||
|
## Breaking changes
|
||
|
|
||
|
- Two breaking changes have been made to `rayon-core`, but since they're fixing
|
||
|
soundness bugs, we are considering these _minor_ changes for semver.
|
||
|
- `Scope::spawn` now requires `Send` for the closure.
|
||
|
- `ThreadPool::install` now requires `Send` for the return value.
|
||
|
- The `iter::internal` module has been renamed to `iter::plumbing`, to hopefully
|
||
|
indicate that while these are low-level details, they're not really internal
|
||
|
or private to rayon. The contents of that module are needed for third-parties
|
||
|
to implement new parallel iterators, and we'll treat them with normal semver
|
||
|
stability guarantees.
|
||
|
- The function `rayon::iter::split` is no longer re-exported as `rayon::split`.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to all of the contributors for this release!
|
||
|
|
||
|
- @AndyGauge
|
||
|
- @ChristopherDavenport
|
||
|
- @chrisvittal
|
||
|
- @cuviper
|
||
|
- @dns2utf8
|
||
|
- @dtolnay
|
||
|
- @frewsxcv
|
||
|
- @gsquire
|
||
|
- @Hittherhod
|
||
|
- @jdr023
|
||
|
- @laumann
|
||
|
- @leodasvacas
|
||
|
- @lvillani
|
||
|
- @MajorBreakfast
|
||
|
- @mamuleanu
|
||
|
- @marmistrz
|
||
|
- @mbrubeck
|
||
|
- @mgattozzi
|
||
|
- @nikomatsakis
|
||
|
- @smt923
|
||
|
- @stjepang
|
||
|
- @tmccombs
|
||
|
- @vishalsodani
|
||
|
- bors[bot]
|
||
|
|
||
|
|
||
|
# Release rayon 0.8.2 (2017-06-28)
|
||
|
|
||
|
- `ParallelSliceMut` now has six parallel sorting methods with the same
|
||
|
variations as the standard library.
|
||
|
- `par_sort`, `par_sort_by`, and `par_sort_by_key` perform stable sorts in
|
||
|
parallel, using the default order, a custom comparator, or a key extraction
|
||
|
function, respectively.
|
||
|
- `par_sort_unstable`, `par_sort_unstable_by`, and `par_sort_unstable_by_key`
|
||
|
perform unstable sorts with the same comparison options.
|
||
|
- Thanks to @stjepang!
|
||
|
|
||
|
|
||
|
# Release rayon 0.8.1 / rayon-core 1.2.0 (2017-06-14)
|
||
|
|
||
|
- The following core APIs are being stabilized:
|
||
|
- `rayon::spawn()` -- spawns a task into the Rayon threadpool; as it
|
||
|
is contained in the global scope (rather than a user-created
|
||
|
scope), the task cannot capture anything from the current stack
|
||
|
frame.
|
||
|
- `ThreadPool::join()`, `ThreadPool::spawn()`, `ThreadPool::scope()`
|
||
|
-- convenience APIs for launching new work within a thread-pool.
|
||
|
- The various iterator adapters are now tagged with `#[must_use]`
|
||
|
- Parallel iterators now offer a `for_each_with` adapter, similar to
|
||
|
`map_with`.
|
||
|
- We are adopting a new approach to handling the remaining unstable
|
||
|
APIs (which primarily pertain to futures integration). As awlays,
|
||
|
unstable APIs are intended for experimentation, but do not come with
|
||
|
any promise of compatibility (in other words, we might change them
|
||
|
in arbitrary ways in any release). Previously, we designated such
|
||
|
APIs using a Cargo feature "unstable". Now, we are using a regular
|
||
|
`#[cfg]` flag. This means that to see the unstable APIs, you must do
|
||
|
`RUSTFLAGS='--cfg rayon_unstable' cargo build`. This is
|
||
|
intentionally inconvenient; in particular, if you are a library,
|
||
|
then your clients must also modify their environment, signaling
|
||
|
their agreement to instability.
|
||
|
|
||
|
|
||
|
# Release rayon 0.8.0 / rayon-core 1.1.0 (2017-06-13)
|
||
|
|
||
|
## Rayon 0.8.0
|
||
|
|
||
|
- Added the `map_with` and `fold_with` combinators, which help for
|
||
|
passing along state (like channels) that cannot be shared between
|
||
|
threads but which can be cloned on each thread split.
|
||
|
- Added the `while_some` combinator, which helps for writing short-circuiting iterators.
|
||
|
- Added support for "short-circuiting" collection: e.g., collecting
|
||
|
from an iterator producing `Option<T>` or `Result<T, E>` into a
|
||
|
`Option<Collection<T>>` or `Result<Collection<T>, E>`.
|
||
|
- Support `FromParallelIterator` for `Cow`.
|
||
|
- Removed the deprecated weight APIs.
|
||
|
- Simplified the parallel iterator trait hierarchy by removing the
|
||
|
`BoundedParallelIterator` and `ExactParallelIterator` traits,
|
||
|
which were not serving much purpose.
|
||
|
- Improved documentation.
|
||
|
- Added some missing `Send` impls.
|
||
|
- Fixed some small bugs.
|
||
|
|
||
|
## Rayon-core 1.1.0
|
||
|
|
||
|
- We now have more documentation.
|
||
|
- Renamed the (unstable) methods `spawn_async` and
|
||
|
`spawn_future_async` -- which spawn tasks that cannot hold
|
||
|
references -- to simply `spawn` and `spawn_future`, respectively.
|
||
|
- We are now using the coco library for our deque.
|
||
|
- Individual threadpools can now be configured in "breadth-first"
|
||
|
mode, which causes them to execute spawned tasks in the reverse
|
||
|
order that they used to. In some specific scenarios, this can be a
|
||
|
win (though it is not generally the right choice).
|
||
|
- Added top-level functions:
|
||
|
- `current_thread_index`, for querying the index of the current worker thread within
|
||
|
its thread-pool (previously available as `thread_pool.current_thread_index()`);
|
||
|
- `current_thread_has_pending_tasks`, for querying whether the
|
||
|
current worker that has an empty task deque or not. This can be
|
||
|
useful when deciding whether to spawn a task.
|
||
|
- The environment variables for controlling Rayon are now
|
||
|
`RAYON_NUM_THREADS` and `RAYON_LOG`. The older variables (e.g.,
|
||
|
`RAYON_RS_NUM_CPUS` are still supported but deprecated).
|
||
|
|
||
|
## Rayon-demo
|
||
|
|
||
|
- Added a new game-of-life benchmark.
|
||
|
|
||
|
## Contributors
|
||
|
|
||
|
Thanks to the following contributors:
|
||
|
|
||
|
- @ChristopherDavenport
|
||
|
- @SuperFluffy
|
||
|
- @antoinewdg
|
||
|
- @crazymykl
|
||
|
- @cuviper
|
||
|
- @glandium
|
||
|
- @julian-seward1
|
||
|
- @leodasvacas
|
||
|
- @leshow
|
||
|
- @lilianmoraru
|
||
|
- @mschmo
|
||
|
- @nikomatsakis
|
||
|
- @stjepang
|
||
|
|
||
|
|
||
|
# Release rayon 0.7.1 / rayon-core 1.0.2 (2017-05-30)
|
||
|
|
||
|
This release is a targeted performance fix for #343, an issue where
|
||
|
rayon threads could sometimes enter into a spin loop where they would
|
||
|
be unable to make progress until they are pre-empted.
|
||
|
|
||
|
|
||
|
# Release rayon 0.7 / rayon-core 1.0 (2017-04-06)
|
||
|
|
||
|
This release marks the first step towards Rayon 1.0. **For best
|
||
|
performance, it is important that all Rayon users update to at least
|
||
|
Rayon 0.7.** This is because, as of Rayon 0.7, we have taken steps to
|
||
|
ensure that, no matter how many versions of rayon are actively in use,
|
||
|
there will only be a single global scheduler. This is achieved via the
|
||
|
`rayon-core` crate, which is being released at version 1.0, and which
|
||
|
encapsulates the core schedule APIs like `join()`. (Note: the
|
||
|
`rayon-core` crate is, to some degree, an implementation detail, and
|
||
|
not intended to be imported directly; it's entire API surface is
|
||
|
mirrored through the rayon crate.)
|
||
|
|
||
|
We have also done a lot of work reorganizing the API for Rayon 0.7 in
|
||
|
preparation for 1.0. The names of iterator types have been changed and
|
||
|
reorganized (but few users are expected to be naming those types
|
||
|
explicitly anyhow). In addition, a number of parallel iterator methods
|
||
|
have been adjusted to match those in the standard iterator traits more
|
||
|
closely. See the "Breaking Changes" section below for
|
||
|
details.
|
||
|
|
||
|
Finally, Rayon 0.7 includes a number of new features and new parallel
|
||
|
iterator methods. **As of this release, Rayon's parallel iterators
|
||
|
have officially reached parity with sequential iterators** -- that is,
|
||
|
every sequential iterator method that makes any sense in parallel is
|
||
|
supported in some capacity.
|
||
|
|
||
|
### New features and methods
|
||
|
|
||
|
- The internal `Producer` trait now features `fold_with`, which enables
|
||
|
better performance for some parallel iterators.
|
||
|
- Strings now support `par_split()` and `par_split_whitespace()`.
|
||
|
- The `Configuration` API is expanded and simplified:
|
||
|
- `num_threads(0)` no longer triggers an error
|
||
|
- you can now supply a closure to name the Rayon threads that get created
|
||
|
by using `Configuration::thread_name`.
|
||
|
- you can now inject code when Rayon threads start up and finish
|
||
|
- you can now set a custom panic handler to handle panics in various odd situations
|
||
|
- Threadpools are now able to more gracefully put threads to sleep when not needed.
|
||
|
- Parallel iterators now support `find_first()`, `find_last()`, `position_first()`,
|
||
|
and `position_last()`.
|
||
|
- Parallel iterators now support `rev()`, which primarily affects subsequent calls
|
||
|
to `enumerate()`.
|
||
|
- The `scope()` API is now considered stable (and part of `rayon-core`).
|
||
|
- There is now a useful `rayon::split` function for creating custom
|
||
|
Rayon parallel iterators.
|
||
|
- Parallel iterators now allow you to customize the min/max number of
|
||
|
items to be processed in a given thread. This mechanism replaces the
|
||
|
older `weight` mechanism, which is deprecated.
|
||
|
- `sum()` and friends now use the standard `Sum` traits
|
||
|
|
||
|
### Breaking changes
|
||
|
|
||
|
In the move towards 1.0, there have been a number of minor breaking changes:
|
||
|
|
||
|
- Configuration setters like `Configuration::set_num_threads()` lost the `set_` prefix,
|
||
|
and hence become something like `Configuration::num_threads()`.
|
||
|
- `Configuration` getters are removed
|
||
|
- Iterator types have been shuffled around and exposed more consistently:
|
||
|
- combinator types live in `rayon::iter`, e.g. `rayon::iter::Filter`
|
||
|
- iterators over various types live in a module named after their type,
|
||
|
e.g. `rayon::slice::Windows`
|
||
|
- When doing a `sum()` or `product()`, type annotations are needed for the result
|
||
|
since it is now possible to have the resulting sum be of a type other than the value
|
||
|
you are iterating over (this mirrors sequential iterators).
|
||
|
|
||
|
### Experimental features
|
||
|
|
||
|
Experimental features require the use of the `unstable` feature. Their
|
||
|
APIs may change or disappear entirely in future releases (even minor
|
||
|
releases) and hence they should be avoided for production code.
|
||
|
|
||
|
- We now have (unstable) support for futures integration. You can use
|
||
|
`Scope::spawn_future` or `rayon::spawn_future_async()`.
|
||
|
- There is now a `rayon::spawn_async()` function for using the Rayon
|
||
|
threadpool to run tasks that do not have references to the stack.
|
||
|
|
||
|
### Contributors
|
||
|
|
||
|
Thanks to the following people for their contributions to this release:
|
||
|
|
||
|
- @Aaronepower
|
||
|
- @ChristopherDavenport
|
||
|
- @bluss
|
||
|
- @cuviper
|
||
|
- @froydnj
|
||
|
- @gaurikholkar
|
||
|
- @hniksic
|
||
|
- @leodasvacas
|
||
|
- @leshow
|
||
|
- @martinhath
|
||
|
- @mbrubeck
|
||
|
- @nikomatsakis
|
||
|
- @pegomes
|
||
|
- @schuster
|
||
|
- @torkleyy
|
||
|
|
||
|
|
||
|
# Release 0.6 (2016-12-21)
|
||
|
|
||
|
This release includes a lot of progress towards the goal of parity
|
||
|
with the sequential iterator API, though there are still a few methods
|
||
|
that are not yet complete. If you'd like to help with that effort,
|
||
|
[check out the milestone](https://github.com/rayon-rs/rayon/issues?q=is%3Aopen+is%3Aissue+milestone%3A%22Parity+with+the+%60Iterator%60+trait%22)
|
||
|
to see the remaining issues.
|
||
|
|
||
|
**Announcement:** @cuviper has been added as a collaborator to the
|
||
|
Rayon repository for all of his outstanding work on Rayon, which
|
||
|
includes both internal refactoring and helping to shape the public
|
||
|
API. Thanks @cuviper! Keep it up.
|
||
|
|
||
|
- We now support `collect()` and not just `collect_with()`.
|
||
|
You can use `collect()` to build a number of collections,
|
||
|
including vectors, maps, and sets. Moreover, when building a vector
|
||
|
with `collect()`, you are no longer limited to exact parallel iterators.
|
||
|
Thanks @nikomatsakis, @cuviper!
|
||
|
- We now support `skip()` and `take()` on parallel iterators.
|
||
|
Thanks @martinhath!
|
||
|
- **Breaking change:** We now match the sequential APIs for `min()` and `max()`.
|
||
|
We also support `min_by_key()` and `max_by_key()`. Thanks @tapeinosyne!
|
||
|
- **Breaking change:** The `mul()` method is now renamed to `product()`,
|
||
|
to match sequential iterators. Thanks @jonathandturner!
|
||
|
- We now support parallel iterator over ranges on `u64` values. Thanks @cuviper!
|
||
|
- We now offer a `par_chars()` method on strings for iterating over characters
|
||
|
in parallel. Thanks @cuviper!
|
||
|
- We now have new demos: a traveling salesman problem solver as well as matrix
|
||
|
multiplication. Thanks @nikomatsakis, @edre!
|
||
|
- We are now documenting our minimum rustc requirement (currently
|
||
|
v1.12.0). We will attempt to maintain compatibility with rustc
|
||
|
stable v1.12.0 as long as it remains convenient, but if new features
|
||
|
are stabilized or added that would be helpful to Rayon, or there are
|
||
|
bug fixes that we need, we will bump to the most recent rustc. Thanks @cuviper!
|
||
|
- The `reduce()` functionality now has better inlining.
|
||
|
Thanks @bluss!
|
||
|
- The `join()` function now has some documentation. Thanks @gsquire!
|
||
|
- The project source has now been fully run through rustfmt.
|
||
|
Thanks @ChristopherDavenport!
|
||
|
- Exposed helper methods for accessing the current thread index.
|
||
|
Thanks @bholley!
|
||
|
|
||
|
|
||
|
# Release 0.5 (2016-11-04)
|
||
|
|
||
|
- **Breaking change:** The `reduce` method has been vastly
|
||
|
simplified, and `reduce_with_identity` has been deprecated.
|
||
|
- **Breaking change:** The `fold` method has been changed. It used to
|
||
|
always reduce the values, but now instead it is a combinator that
|
||
|
returns a parallel iterator which can itself be reduced. See the
|
||
|
docs for more information.
|
||
|
- The following parallel iterator combinators are now available (thanks @cuviper!):
|
||
|
- `find_any()`: similar to `find` on a sequential iterator,
|
||
|
but doesn't necessarily return the *first* matching item
|
||
|
- `position_any()`: similar to `position` on a sequential iterator,
|
||
|
but doesn't necessarily return the index of *first* matching item
|
||
|
- `any()`, `all()`: just like their sequential counterparts
|
||
|
- The `count()` combinator is now available for parallel iterators.
|
||
|
- We now build with older versions of rustc again (thanks @durango!),
|
||
|
as we removed a stray semicolon from `thread_local!`.
|
||
|
- Various improvements to the (unstable) `scope()` API implementation.
|
||
|
|
||
|
|
||
|
# Release 0.4.3 (2016-10-25)
|
||
|
|
||
|
- Parallel iterators now offer an adaptive weight scheme,
|
||
|
which means that explicit weights should no longer
|
||
|
be necessary in most cases! Thanks @cuviper!
|
||
|
- We are considering removing weights or changing the weight mechanism
|
||
|
before 1.0. Examples of scenarios where you still need weights even
|
||
|
with this adaptive mechanism would be great. Join the discussion
|
||
|
at <https://github.com/rayon-rs/rayon/issues/111>.
|
||
|
- New (unstable) scoped threads API, see `rayon::scope` for details.
|
||
|
- You will need to supply the [cargo feature] `unstable`.
|
||
|
- The various demos and benchmarks have been consolidated into one
|
||
|
program, `rayon-demo`.
|
||
|
- Optimizations in Rayon's inner workings. Thanks @emilio!
|
||
|
- Update `num_cpus` to 1.0. Thanks @jamwt!
|
||
|
- Various internal cleanup in the implementation and typo fixes.
|
||
|
Thanks @cuviper, @Eh2406, and @spacejam!
|
||
|
|
||
|
[cargo feature]: https://doc.rust-lang.org/cargo/reference/features.html#the-features-section
|
||
|
|
||
|
|
||
|
# Release 0.4.2 (2016-09-15)
|
||
|
|
||
|
- Updated crates.io metadata.
|
||
|
|
||
|
|
||
|
# Release 0.4.1 (2016-09-14)
|
||
|
|
||
|
- New `chain` combinator for parallel iterators.
|
||
|
- `Option`, `Result`, as well as many more collection types now have
|
||
|
parallel iterators.
|
||
|
- New mergesort demo.
|
||
|
- Misc fixes.
|
||
|
|
||
|
Thanks to @cuviper, @edre, @jdanford, @frewsxcv for their contributions!
|
||
|
|
||
|
|
||
|
# Release 0.4 (2016-05-16)
|
||
|
|
||
|
- Make use of latest versions of catch-panic and various fixes to panic propagation.
|
||
|
- Add new prime sieve demo.
|
||
|
- Add `cloned()` and `inspect()` combinators.
|
||
|
- Misc fixes for Rust RFC 1214.
|
||
|
|
||
|
Thanks to @areilb1, @Amanieu, @SharplEr, and @cuviper for their contributions!
|
||
|
|
||
|
|
||
|
# Release 0.3 (2016-02-23)
|
||
|
|
||
|
- Expanded `par_iter` APIs now available:
|
||
|
- `into_par_iter` is now supported on vectors (taking ownership of the elements)
|
||
|
- Panic handling is much improved:
|
||
|
- if you use the Nightly feature, experimental panic recovery is available
|
||
|
- otherwise, panics propagate out and poision the workpool
|
||
|
- New `Configuration` object to control number of threads and other details
|
||
|
- New demos and benchmarks
|
||
|
- try `cargo run --release -- visualize` in `demo/nbody` :)
|
||
|
- Note: a nightly compiler is required for this demo due to the
|
||
|
use of the `+=` syntax
|
||
|
|
||
|
Thanks to @bjz, @cuviper, @Amanieu, and @willi-kappler for their contributions!
|
||
|
|
||
|
|
||
|
# Release 0.2 and earlier
|
||
|
|
||
|
No release notes were being kept at this time.
|