]>
Commit | Line | Data |
---|---|---|
923072b8 FG |
1 | # Release rayon 1.5.3 (2022-05-13) |
2 | ||
3 | - The new `ParallelSliceMut::par_sort_by_cached_key` is a stable sort that caches | |
4 | the keys for each item -- a parallel version of `slice::sort_by_cached_key`. | |
5 | ||
6 | # Release rayon-core 1.9.3 (2022-05-13) | |
7 | ||
8 | - Fixed a use-after-free race in job notification. | |
9 | ||
04454e1e FG |
10 | # Release rayon 1.5.2 / rayon-core 1.9.2 (2022-04-13) |
11 | ||
12 | - The new `ParallelSlice::par_rchunks()` and `par_rchunks_exact()` iterate | |
13 | slice chunks in reverse, aligned the against the end of the slice if the | |
14 | length is not a perfect multiple of the chunk size. The new | |
15 | `ParallelSliceMut::par_rchunks_mut()` and `par_rchunks_exact_mut()` are the | |
16 | same for mutable slices. | |
17 | - The `ParallelIterator::try_*` methods now support `std::ops::ControlFlow` and | |
18 | `std::task::Poll` items, mirroring the unstable `Try` implementations in the | |
19 | standard library. | |
20 | - The `ParallelString` pattern-based methods now support `&[char]` patterns, | |
21 | which match when any character in that slice is found in the string. | |
22 | - A soft limit is now enforced on the number of threads allowed in a single | |
23 | thread pool, respecting internal bit limits that already existed. The current | |
24 | maximum is publicly available from the new function `max_num_threads()`. | |
25 | - Fixed several Stacked Borrow and provenance issues found by `cargo miri`. | |
26 | ||
27 | ## Contributors | |
28 | ||
29 | Thanks to all of the contributors for this release! | |
30 | ||
31 | - @atouchet | |
32 | - @bluss | |
33 | - @cuviper | |
34 | - @fzyzcjy | |
35 | - @nyanzebra | |
36 | - @paolobarbolini | |
37 | - @RReverser | |
38 | - @saethlin | |
39 | ||
17df50a5 XL |
40 | # Release rayon 1.5.1 / rayon-core 1.9.1 (2021-05-18) |
41 | ||
42 | - The new `in_place_scope` and `in_place_scope_fifo` are variations of `scope` | |
43 | and `scope_fifo`, running the initial non-`Send` callback directly on the | |
44 | current thread, rather than moving execution to the thread pool. | |
45 | - With Rust 1.51 or later, arrays now implement `IntoParallelIterator`. | |
46 | - New implementations of `FromParallelIterator` make it possible to `collect` | |
47 | complicated nestings of items. | |
48 | - `FromParallelIterator<(A, B)> for (FromA, FromB)` works like `unzip`. | |
49 | - `FromParallelIterator<Either<L, R>> for (A, B)` works like `partition_map`. | |
50 | - Type inference now works better with parallel `Range` and `RangeInclusive`. | |
51 | - The implementation of `FromParallelIterator` and `ParallelExtend` for | |
52 | `Vec<T>` now uses `MaybeUninit<T>` internally to avoid creating any | |
53 | references to uninitialized data. | |
54 | - `ParallelBridge` fixed a bug with threads missing available work. | |
55 | ||
56 | ## Contributors | |
57 | ||
58 | Thanks to all of the contributors for this release! | |
59 | ||
60 | - @atouchet | |
61 | - @cuviper | |
62 | - @Hywan | |
63 | - @iRaiko | |
64 | - @Qwaz | |
65 | - @rocallahan | |
66 | ||
5869c6ff XL |
67 | # Release rayon 1.5.0 / rayon-core 1.9.0 (2020-10-21) |
68 | ||
69 | - Update crossbeam dependencies. | |
70 | - The minimum supported `rustc` is now 1.36. | |
71 | ||
72 | ## Contributors | |
73 | ||
74 | Thanks to all of the contributors for this release! | |
75 | ||
76 | - @cuviper | |
77 | - @mbrubeck | |
78 | - @mrksu | |
79 | ||
80 | # Release rayon 1.4.1 (2020-09-29) | |
81 | ||
82 | - The new `flat_map_iter` and `flatten_iter` methods can be used to flatten | |
83 | sequential iterators, which may perform better in cases that don't need the | |
84 | nested parallelism of `flat_map` and `flatten`. | |
85 | - The new `par_drain` method is a parallel version of the standard `drain` for | |
86 | collections, removing items while keeping the original capacity. Collections | |
87 | that implement this through `ParallelDrainRange` support draining items from | |
88 | arbitrary index ranges, while `ParallelDrainFull` always drains everything. | |
89 | - The new `positions` method finds all items that match the given predicate and | |
90 | returns their indices in a new iterator. | |
91 | ||
92 | # Release rayon-core 1.8.1 (2020-09-17) | |
93 | ||
94 | - Fixed an overflow panic on high-contention workloads, for a counter that was | |
95 | meant to simply wrap. This panic only occurred with debug assertions enabled, | |
96 | and was much more likely on 32-bit targets. | |
97 | ||
1b1a35ee XL |
98 | # Release rayon 1.4.0 / rayon-core 1.8.0 (2020-08-24) |
99 | ||
100 | - Implemented a new thread scheduler, [RFC 5], which uses targeted wakeups for | |
101 | new work and for notifications of completed stolen work, reducing wasteful | |
102 | CPU usage in idle threads. | |
103 | - Implemented `IntoParallelIterator for Range<char>` and `RangeInclusive<char>` | |
104 | with the same iteration semantics as Rust 1.45. | |
105 | - Relaxed the lifetime requirements of the initial `scope` closure. | |
106 | ||
107 | [RFC 5]: https://github.com/rayon-rs/rfcs/pull/5 | |
108 | ||
109 | ## Contributors | |
110 | ||
111 | Thanks to all of the contributors for this release! | |
112 | ||
113 | - @CAD97 | |
114 | - @cuviper | |
115 | - @kmaork | |
116 | - @nikomatsakis | |
117 | - @SuperFluffy | |
118 | ||
119 | ||
f035d41b XL |
120 | # Release rayon 1.3.1 / rayon-core 1.7.1 (2020-06-15) |
121 | ||
122 | - Fixed a use-after-free race in calls blocked between two rayon thread pools. | |
123 | - Collecting to an indexed `Vec` now drops any partial writes while unwinding, | |
124 | rather than just leaking them. If dropping also panics, Rust will abort. | |
125 | - Note: the old leaking behavior is considered _safe_, just not ideal. | |
126 | - The new `IndexedParallelIterator::step_by()` adapts an iterator to step | |
127 | through items by the given count, like `Iterator::step_by()`. | |
128 | - The new `ParallelSlice::par_chunks_exact()` and mutable equivalent | |
129 | `ParallelSliceMut::par_chunks_exact_mut()` ensure that the chunks always have | |
130 | the exact length requested, leaving any remainder separate, like the slice | |
131 | methods `chunks_exact()` and `chunks_exact_mut()`. | |
132 | ||
133 | ## Contributors | |
134 | ||
135 | Thanks to all of the contributors for this release! | |
136 | ||
137 | - @adrian5 | |
138 | - @bluss | |
139 | - @cuviper | |
140 | - @FlyingCanoe | |
141 | - @GuillaumeGomez | |
142 | - @matthiasbeyer | |
143 | - @picoHz | |
144 | - @zesterer | |
145 | ||
146 | ||
147 | # Release rayon 1.3.0 / rayon-core 1.7.0 (2019-12-21) | |
148 | ||
149 | - Tuples up to length 12 now implement `IntoParallelIterator`, creating a | |
150 | `MultiZip` iterator that produces items as similarly-shaped tuples. | |
151 | - The `--cfg=rayon_unstable` supporting code for `rayon-futures` is removed. | |
152 | - The minimum supported `rustc` is now 1.31. | |
153 | ||
154 | ## Contributors | |
155 | ||
156 | Thanks to all of the contributors for this release! | |
157 | ||
158 | - @cuviper | |
159 | - @c410-f3r | |
160 | - @silwol | |
161 | ||
162 | ||
163 | # Release rayon-futures 0.1.1 (2019-12-21) | |
164 | ||
165 | - `Send` bounds have been added for the `Item` and `Error` associated types on | |
166 | all generic `F: Future` interfaces. While technically a breaking change, this | |
167 | is a soundness fix, so we are not increasing the semantic version for this. | |
168 | - This crate is now deprecated, and the `--cfg=rayon_unstable` supporting code | |
169 | will be removed in `rayon-core 1.7.0`. This only supported the now-obsolete | |
170 | `Future` from `futures 0.1`, while support for `std::future::Future` is | |
171 | expected to come directly in `rayon-core` -- although that is not ready yet. | |
172 | ||
173 | ## Contributors | |
174 | ||
175 | Thanks to all of the contributors for this release! | |
176 | ||
177 | - @cuviper | |
178 | - @kornelski | |
179 | - @jClaireCodesStuff | |
180 | - @jwass | |
181 | - @seanchen1991 | |
182 | ||
183 | ||
184 | # Release rayon 1.2.1 / rayon-core 1.6.1 (2019-11-20) | |
185 | ||
186 | - Update crossbeam dependencies. | |
187 | - Add top-level doc links for the iterator traits. | |
188 | - Document that the iterator traits are not object safe. | |
189 | ||
190 | ## Contributors | |
191 | ||
192 | Thanks to all of the contributors for this release! | |
193 | ||
194 | - @cuviper | |
195 | - @dnaka91 | |
196 | - @matklad | |
197 | - @nikomatsakis | |
198 | - @Qqwy | |
199 | - @vorner | |
200 | ||
201 | ||
e74abb32 XL |
202 | # Release rayon 1.2.0 / rayon-core 1.6.0 (2019-08-30) |
203 | ||
204 | - The new `ParallelIterator::copied()` converts an iterator of references into | |
205 | copied values, like `Iterator::copied()`. | |
206 | - `ParallelExtend` is now implemented for the unit `()`. | |
207 | - Internal updates were made to improve test determinism, reduce closure type | |
208 | sizes, reduce task allocations, and update dependencies. | |
209 | - The minimum supported `rustc` is now 1.28. | |
210 | ||
211 | ## Contributors | |
212 | ||
213 | Thanks to all of the contributors for this release! | |
214 | ||
215 | - @Aaron1011 | |
216 | - @cuviper | |
217 | - @ralfbiedert | |
218 | ||
219 | ||
416331ca XL |
220 | # Release rayon 1.1.0 / rayon-core 1.5.0 (2019-06-12) |
221 | ||
222 | - FIFO spawns are now supported using the new `spawn_fifo()` and `scope_fifo()` | |
223 | global functions, and their corresponding `ThreadPool` methods. | |
224 | - Normally when tasks are queued on a thread, the most recent is processed | |
225 | first (LIFO) while other threads will steal the oldest (FIFO). With FIFO | |
226 | spawns, those tasks are processed locally in FIFO order too. | |
227 | - Regular spawns and other tasks like `join` are not affected. | |
228 | - The `breadth_first` configuration flag, which globally approximated this | |
229 | effect, is now deprecated. | |
230 | - For more design details, please see [RFC 1]. | |
231 | - `ThreadPoolBuilder` can now take a custom `spawn_handler` to control how | |
232 | threads will be created in the pool. | |
233 | - `ThreadPoolBuilder::build_scoped()` uses this to create a scoped thread | |
234 | pool, where the threads are able to use non-static data. | |
235 | - This may also be used to support threading in exotic environments, like | |
236 | WebAssembly, which don't support the normal `std::thread`. | |
237 | - `ParallelIterator` has 3 new methods: `find_map_any()`, `find_map_first()`, | |
238 | and `find_map_last()`, like `Iterator::find_map()` with ordering constraints. | |
239 | - The new `ParallelIterator::panic_fuse()` makes a parallel iterator halt as soon | |
240 | as possible if any of its threads panic. Otherwise, the panic state is not | |
241 | usually noticed until the iterator joins its parallel tasks back together. | |
242 | - `IntoParallelIterator` is now implemented for integral `RangeInclusive`. | |
243 | - Several internal `Folder`s now have optimized `consume_iter` implementations. | |
244 | - `rayon_core::current_thread_index()` is now re-exported in `rayon`. | |
245 | - The minimum `rustc` is now 1.26, following the update policy defined in [RFC 3]. | |
246 | ||
247 | ## Contributors | |
248 | ||
249 | Thanks to all of the contributors for this release! | |
250 | ||
251 | - @cuviper | |
252 | - @didroe | |
253 | - @GuillaumeGomez | |
254 | - @huonw | |
255 | - @janriemer | |
256 | - @kornelski | |
257 | - @nikomatsakis | |
258 | - @seanchen1991 | |
259 | - @yegeun542 | |
260 | ||
261 | [RFC 1]: https://github.com/rayon-rs/rfcs/blob/master/accepted/rfc0001-scope-scheduling.md | |
262 | [RFC 3]: https://github.com/rayon-rs/rfcs/blob/master/accepted/rfc0003-minimum-rustc.md | |
263 | ||
264 | ||
265 | # Release rayon 1.0.3 (2018-11-02) | |
266 | ||
267 | - `ParallelExtend` is now implemented for tuple pairs, enabling nested | |
268 | `unzip()` and `partition_map()` operations. For instance, `(A, (B, C))` | |
269 | items can be unzipped into `(Vec<A>, (Vec<B>, Vec<C>))`. | |
270 | - `ParallelExtend<(A, B)>` works like `unzip()`. | |
271 | - `ParallelExtend<Either<A, B>>` works like `partition_map()`. | |
272 | - `ParallelIterator` now has a method `map_init()` which calls an `init` | |
273 | function for a value to pair with items, like `map_with()` but dynamically | |
274 | constructed. That value type has no constraints, not even `Send` or `Sync`. | |
275 | - The new `for_each_init()` is a variant of this for simple iteration. | |
276 | - The new `try_for_each_init()` is a variant for fallible iteration. | |
277 | ||
278 | ## Contributors | |
279 | ||
280 | Thanks to all of the contributors for this release! | |
281 | ||
282 | - @cuviper | |
283 | - @dan-zheng | |
284 | - @dholbert | |
285 | - @ignatenkobrain | |
286 | - @mdonoughe | |
287 | ||
288 | ||
289 | # Release rayon 1.0.2 / rayon-core 1.4.1 (2018-07-17) | |
290 | ||
291 | - The `ParallelBridge` trait with method `par_bridge()` makes it possible to | |
292 | use any `Send`able `Iterator` in parallel! | |
293 | - This trait has been added to `rayon::prelude`. | |
294 | - It automatically implements internal synchronization and queueing to | |
295 | spread the `Item`s across the thread pool. Iteration order is not | |
296 | preserved by this adaptor. | |
297 | - "Native" Rayon iterators like `par_iter()` should still be preferred when | |
298 | possible for better efficiency. | |
299 | - `ParallelString` now has additional methods for parity with `std` string | |
300 | iterators: `par_char_indices()`, `par_bytes()`, `par_encode_utf16()`, | |
301 | `par_matches()`, and `par_match_indices()`. | |
302 | - `ParallelIterator` now has fallible methods `try_fold()`, `try_reduce()`, | |
303 | and `try_for_each`, plus `*_with()` variants of each, for automatically | |
304 | short-circuiting iterators on `None` or `Err` values. These are inspired by | |
305 | `Iterator::try_fold()` and `try_for_each()` that were stabilized in Rust 1.27. | |
306 | - `Range<i128>` and `Range<u128>` are now supported with Rust 1.26 and later. | |
307 | - Small improvements have been made to the documentation. | |
308 | - `rayon-core` now only depends on `rand` for testing. | |
309 | - Rayon tests now work on stable Rust. | |
310 | ||
311 | ## Contributors | |
312 | ||
313 | Thanks to all of the contributors for this release! | |
314 | ||
315 | - @AndyGauge | |
316 | - @cuviper | |
317 | - @ignatenkobrain | |
318 | - @LukasKalbertodt | |
319 | - @MajorBreakfast | |
320 | - @nikomatsakis | |
321 | - @paulkernfeld | |
322 | - @QuietMisdreavus | |
323 | ||
324 | ||
325 | # Release rayon 1.0.1 (2018-03-16) | |
83c7162d XL |
326 | |
327 | - Added more documentation for `rayon::iter::split()`. | |
328 | - Corrected links and typos in documentation. | |
329 | ||
330 | ## Contributors | |
331 | ||
332 | Thanks to all of the contributors for this release! | |
333 | ||
334 | - @cuviper | |
335 | - @HadrienG2 | |
336 | - @matthiasbeyer | |
337 | - @nikomatsakis | |
338 | ||
339 | ||
416331ca | 340 | # Release rayon 1.0.0 / rayon-core 1.4.0 (2018-02-15) |
2c00a5a8 XL |
341 | |
342 | - `ParallelIterator` added the `update` method which applies a function to | |
343 | mutable references, inspired by `itertools`. | |
344 | - `IndexedParallelIterator` added the `chunks` method which yields vectors of | |
345 | consecutive items from the base iterator, inspired by `itertools`. | |
346 | - `String` now implements `FromParallelIterator<Cow<str>>` and | |
347 | `ParallelExtend<Cow<str>>`, inspired by `std`. | |
348 | - `()` now implements `FromParallelIterator<()>`, inspired by `std`. | |
349 | - The new `ThreadPoolBuilder` replaces and deprecates `Configuration`. | |
350 | - Errors from initialization now have the concrete `ThreadPoolBuildError` | |
351 | type, rather than `Box<Error>`, and this type implements `Send` and `Sync`. | |
352 | - `ThreadPool::new` is deprecated in favor of `ThreadPoolBuilder::build`. | |
353 | - `initialize` is deprecated in favor of `ThreadPoolBuilder::build_global`. | |
354 | - Examples have been added to most of the parallel iterator methods. | |
355 | - A lot of the documentation has been reorganized and extended. | |
356 | ||
357 | ## Breaking changes | |
358 | ||
359 | - Rayon now requires rustc 1.13 or greater. | |
360 | - `IndexedParallelIterator::len` and `ParallelIterator::opt_len` now operate on | |
361 | `&self` instead of `&mut self`. | |
362 | - `IndexedParallelIterator::collect_into` is now `collect_into_vec`. | |
363 | - `IndexedParallelIterator::unzip_into` is now `unzip_into_vecs`. | |
364 | - Rayon no longer exports the deprecated `Configuration` and `initialize` from | |
365 | rayon-core. | |
366 | ||
367 | ## Contributors | |
368 | ||
369 | Thanks to all of the contributors for this release! | |
370 | ||
371 | - @Bilkow | |
372 | - @cuviper | |
373 | - @Enet4 | |
374 | - @ignatenkobrain | |
375 | - @iwillspeak | |
376 | - @jeehoonkang | |
377 | - @jwass | |
378 | - @Kerollmops | |
379 | - @KodrAus | |
380 | - @kornelski | |
381 | - @MaloJaffre | |
382 | - @nikomatsakis | |
383 | - @obv-mikhail | |
384 | - @oddg | |
385 | - @phimuemue | |
386 | - @stjepang | |
387 | - @tmccombs | |
388 | - bors[bot] | |
389 | ||
390 | ||
416331ca | 391 | # Release rayon 0.9.0 / rayon-core 1.3.0 / rayon-futures 0.1.0 (2017-11-09) |
2c00a5a8 XL |
392 | |
393 | - `Configuration` now has a `build` method. | |
394 | - `ParallelIterator` added `flatten` and `intersperse`, both inspired by | |
395 | itertools. | |
396 | - `IndexedParallelIterator` added `interleave`, `interleave_shortest`, and | |
397 | `zip_eq`, all inspired by itertools. | |
398 | - The new functions `iter::empty` and `once` create parallel iterators of | |
399 | exactly zero or one item, like their `std` counterparts. | |
400 | - The new functions `iter::repeat` and `repeatn` create parallel iterators | |
401 | repeating an item indefinitely or `n` times, respectively. | |
402 | - The new function `join_context` works like `join`, with an added `FnContext` | |
403 | parameter that indicates whether the job was stolen. | |
404 | - `Either` (used by `ParallelIterator::partition_map`) is now re-exported from | |
405 | the `either` crate, instead of defining our own type. | |
406 | - `Either` also now implements `ParallelIterator`, `IndexedParallelIterator`, | |
407 | and `ParallelExtend` when both of its `Left` and `Right` types do. | |
408 | - All public types now implement `Debug`. | |
409 | - Many of the parallel iterators now implement `Clone` where possible. | |
410 | - Much of the documentation has been extended. (but still could use more help!) | |
411 | - All rayon crates have improved metadata. | |
412 | - Rayon was evaluated in the Libz Blitz, leading to many of these improvements. | |
413 | - Rayon pull requests are now guarded by bors-ng. | |
414 | ||
415 | ## Futures | |
416 | ||
417 | The `spawn_future()` method has been refactored into its own `rayon-futures` | |
418 | crate, now through a `ScopeFutureExt` trait for `ThreadPool` and `Scope`. The | |
419 | supporting `rayon-core` APIs are still gated by `--cfg rayon_unstable`. | |
420 | ||
421 | ## Breaking changes | |
422 | ||
423 | - Two breaking changes have been made to `rayon-core`, but since they're fixing | |
424 | soundness bugs, we are considering these _minor_ changes for semver. | |
425 | - `Scope::spawn` now requires `Send` for the closure. | |
426 | - `ThreadPool::install` now requires `Send` for the return value. | |
427 | - The `iter::internal` module has been renamed to `iter::plumbing`, to hopefully | |
428 | indicate that while these are low-level details, they're not really internal | |
429 | or private to rayon. The contents of that module are needed for third-parties | |
430 | to implement new parallel iterators, and we'll treat them with normal semver | |
431 | stability guarantees. | |
432 | - The function `rayon::iter::split` is no longer re-exported as `rayon::split`. | |
433 | ||
434 | ## Contributors | |
435 | ||
436 | Thanks to all of the contributors for this release! | |
437 | ||
438 | - @AndyGauge | |
439 | - @ChristopherDavenport | |
440 | - @chrisvittal | |
441 | - @cuviper | |
442 | - @dns2utf8 | |
443 | - @dtolnay | |
444 | - @frewsxcv | |
445 | - @gsquire | |
446 | - @Hittherhod | |
447 | - @jdr023 | |
448 | - @laumann | |
449 | - @leodasvacas | |
450 | - @lvillani | |
451 | - @MajorBreakfast | |
452 | - @mamuleanu | |
453 | - @marmistrz | |
454 | - @mbrubeck | |
455 | - @mgattozzi | |
456 | - @nikomatsakis | |
457 | - @smt923 | |
458 | - @stjepang | |
459 | - @tmccombs | |
460 | - @vishalsodani | |
461 | - bors[bot] | |
462 | ||
463 | ||
416331ca | 464 | # Release rayon 0.8.2 (2017-06-28) |
2c00a5a8 XL |
465 | |
466 | - `ParallelSliceMut` now has six parallel sorting methods with the same | |
467 | variations as the standard library. | |
468 | - `par_sort`, `par_sort_by`, and `par_sort_by_key` perform stable sorts in | |
469 | parallel, using the default order, a custom comparator, or a key extraction | |
470 | function, respectively. | |
471 | - `par_sort_unstable`, `par_sort_unstable_by`, and `par_sort_unstable_by_key` | |
472 | perform unstable sorts with the same comparison options. | |
473 | - Thanks to @stjepang! | |
474 | ||
416331ca XL |
475 | |
476 | # Release rayon 0.8.1 / rayon-core 1.2.0 (2017-06-14) | |
2c00a5a8 XL |
477 | |
478 | - The following core APIs are being stabilized: | |
479 | - `rayon::spawn()` -- spawns a task into the Rayon threadpool; as it | |
480 | is contained in the global scope (rather than a user-created | |
481 | scope), the task cannot capture anything from the current stack | |
482 | frame. | |
483 | - `ThreadPool::join()`, `ThreadPool::spawn()`, `ThreadPool::scope()` | |
416331ca | 484 | -- convenience APIs for launching new work within a thread-pool. |
2c00a5a8 XL |
485 | - The various iterator adapters are now tagged with `#[must_use]` |
486 | - Parallel iterators now offer a `for_each_with` adapter, similar to | |
487 | `map_with`. | |
488 | - We are adopting a new approach to handling the remaining unstable | |
489 | APIs (which primarily pertain to futures integration). As awlays, | |
490 | unstable APIs are intended for experimentation, but do not come with | |
491 | any promise of compatibility (in other words, we might change them | |
492 | in arbitrary ways in any release). Previously, we designated such | |
493 | APIs using a Cargo feature "unstable". Now, we are using a regular | |
494 | `#[cfg]` flag. This means that to see the unstable APIs, you must do | |
495 | `RUSTFLAGS='--cfg rayon_unstable' cargo build`. This is | |
496 | intentionally inconvenient; in particular, if you are a library, | |
497 | then your clients must also modify their environment, signaling | |
498 | their agreement to instability. | |
499 | ||
416331ca XL |
500 | |
501 | # Release rayon 0.8.0 / rayon-core 1.1.0 (2017-06-13) | |
2c00a5a8 XL |
502 | |
503 | ## Rayon 0.8.0 | |
504 | ||
505 | - Added the `map_with` and `fold_with` combinators, which help for | |
506 | passing along state (like channels) that cannot be shared between | |
507 | threads but which can be cloned on each thread split. | |
508 | - Added the `while_some` combinator, which helps for writing short-circuiting iterators. | |
509 | - Added support for "short-circuiting" collection: e.g., collecting | |
510 | from an iterator producing `Option<T>` or `Result<T, E>` into a | |
511 | `Option<Collection<T>>` or `Result<Collection<T>, E>`. | |
512 | - Support `FromParallelIterator` for `Cow`. | |
513 | - Removed the deprecated weight APIs. | |
514 | - Simplified the parallel iterator trait hierarchy by removing the | |
515 | `BoundedParallelIterator` and `ExactParallelIterator` traits, | |
516 | which were not serving much purpose. | |
517 | - Improved documentation. | |
518 | - Added some missing `Send` impls. | |
519 | - Fixed some small bugs. | |
520 | ||
521 | ## Rayon-core 1.1.0 | |
522 | ||
523 | - We now have more documentation. | |
524 | - Renamed the (unstable) methods `spawn_async` and | |
525 | `spawn_future_async` -- which spawn tasks that cannot hold | |
526 | references -- to simply `spawn` and `spawn_future`, respectively. | |
527 | - We are now using the coco library for our deque. | |
528 | - Individual threadpools can now be configured in "breadth-first" | |
529 | mode, which causes them to execute spawned tasks in the reverse | |
530 | order that they used to. In some specific scenarios, this can be a | |
531 | win (though it is not generally the right choice). | |
532 | - Added top-level functions: | |
533 | - `current_thread_index`, for querying the index of the current worker thread within | |
534 | its thread-pool (previously available as `thread_pool.current_thread_index()`); | |
535 | - `current_thread_has_pending_tasks`, for querying whether the | |
536 | current worker that has an empty task deque or not. This can be | |
537 | useful when deciding whether to spawn a task. | |
538 | - The environment variables for controlling Rayon are now | |
539 | `RAYON_NUM_THREADS` and `RAYON_LOG`. The older variables (e.g., | |
540 | `RAYON_RS_NUM_CPUS` are still supported but deprecated). | |
541 | ||
542 | ## Rayon-demo | |
543 | ||
544 | - Added a new game-of-life benchmark. | |
545 | ||
546 | ## Contributors | |
547 | ||
548 | Thanks to the following contributors: | |
549 | ||
550 | - @ChristopherDavenport | |
551 | - @SuperFluffy | |
552 | - @antoinewdg | |
553 | - @crazymykl | |
554 | - @cuviper | |
555 | - @glandium | |
556 | - @julian-seward1 | |
557 | - @leodasvacas | |
558 | - @leshow | |
559 | - @lilianmoraru | |
560 | - @mschmo | |
561 | - @nikomatsakis | |
562 | - @stjepang | |
563 | ||
416331ca XL |
564 | |
565 | # Release rayon 0.7.1 / rayon-core 1.0.2 (2017-05-30) | |
2c00a5a8 XL |
566 | |
567 | This release is a targeted performance fix for #343, an issue where | |
568 | rayon threads could sometimes enter into a spin loop where they would | |
569 | be unable to make progress until they are pre-empted. | |
570 | ||
416331ca XL |
571 | |
572 | # Release rayon 0.7 / rayon-core 1.0 (2017-04-06) | |
2c00a5a8 XL |
573 | |
574 | This release marks the first step towards Rayon 1.0. **For best | |
575 | performance, it is important that all Rayon users update to at least | |
576 | Rayon 0.7.** This is because, as of Rayon 0.7, we have taken steps to | |
577 | ensure that, no matter how many versions of rayon are actively in use, | |
578 | there will only be a single global scheduler. This is achieved via the | |
579 | `rayon-core` crate, which is being released at version 1.0, and which | |
580 | encapsulates the core schedule APIs like `join()`. (Note: the | |
581 | `rayon-core` crate is, to some degree, an implementation detail, and | |
582 | not intended to be imported directly; it's entire API surface is | |
583 | mirrored through the rayon crate.) | |
584 | ||
585 | We have also done a lot of work reorganizing the API for Rayon 0.7 in | |
586 | preparation for 1.0. The names of iterator types have been changed and | |
587 | reorganized (but few users are expected to be naming those types | |
588 | explicitly anyhow). In addition, a number of parallel iterator methods | |
589 | have been adjusted to match those in the standard iterator traits more | |
590 | closely. See the "Breaking Changes" section below for | |
591 | details. | |
592 | ||
593 | Finally, Rayon 0.7 includes a number of new features and new parallel | |
594 | iterator methods. **As of this release, Rayon's parallel iterators | |
595 | have officially reached parity with sequential iterators** -- that is, | |
596 | every sequential iterator method that makes any sense in parallel is | |
597 | supported in some capacity. | |
598 | ||
599 | ### New features and methods | |
600 | ||
601 | - The internal `Producer` trait now features `fold_with`, which enables | |
602 | better performance for some parallel iterators. | |
603 | - Strings now support `par_split()` and `par_split_whitespace()`. | |
604 | - The `Configuration` API is expanded and simplified: | |
416331ca XL |
605 | - `num_threads(0)` no longer triggers an error |
606 | - you can now supply a closure to name the Rayon threads that get created | |
2c00a5a8 XL |
607 | by using `Configuration::thread_name`. |
608 | - you can now inject code when Rayon threads start up and finish | |
609 | - you can now set a custom panic handler to handle panics in various odd situations | |
610 | - Threadpools are now able to more gracefully put threads to sleep when not needed. | |
611 | - Parallel iterators now support `find_first()`, `find_last()`, `position_first()`, | |
612 | and `position_last()`. | |
613 | - Parallel iterators now support `rev()`, which primarily affects subsequent calls | |
614 | to `enumerate()`. | |
615 | - The `scope()` API is now considered stable (and part of `rayon-core`). | |
616 | - There is now a useful `rayon::split` function for creating custom | |
617 | Rayon parallel iterators. | |
618 | - Parallel iterators now allow you to customize the min/max number of | |
619 | items to be processed in a given thread. This mechanism replaces the | |
620 | older `weight` mechanism, which is deprecated. | |
621 | - `sum()` and friends now use the standard `Sum` traits | |
622 | ||
623 | ### Breaking changes | |
624 | ||
625 | In the move towards 1.0, there have been a number of minor breaking changes: | |
626 | ||
627 | - Configuration setters like `Configuration::set_num_threads()` lost the `set_` prefix, | |
628 | and hence become something like `Configuration::num_threads()`. | |
629 | - `Configuration` getters are removed | |
630 | - Iterator types have been shuffled around and exposed more consistently: | |
631 | - combinator types live in `rayon::iter`, e.g. `rayon::iter::Filter` | |
632 | - iterators over various types live in a module named after their type, | |
633 | e.g. `rayon::slice::Windows` | |
634 | - When doing a `sum()` or `product()`, type annotations are needed for the result | |
635 | since it is now possible to have the resulting sum be of a type other than the value | |
636 | you are iterating over (this mirrors sequential iterators). | |
637 | ||
638 | ### Experimental features | |
639 | ||
640 | Experimental features require the use of the `unstable` feature. Their | |
641 | APIs may change or disappear entirely in future releases (even minor | |
642 | releases) and hence they should be avoided for production code. | |
643 | ||
644 | - We now have (unstable) support for futures integration. You can use | |
645 | `Scope::spawn_future` or `rayon::spawn_future_async()`. | |
646 | - There is now a `rayon::spawn_async()` function for using the Rayon | |
647 | threadpool to run tasks that do not have references to the stack. | |
648 | ||
649 | ### Contributors | |
650 | ||
651 | Thanks to the following people for their contributions to this release: | |
652 | ||
653 | - @Aaronepower | |
654 | - @ChristopherDavenport | |
655 | - @bluss | |
656 | - @cuviper | |
657 | - @froydnj | |
658 | - @gaurikholkar | |
659 | - @hniksic | |
660 | - @leodasvacas | |
661 | - @leshow | |
662 | - @martinhath | |
663 | - @mbrubeck | |
664 | - @nikomatsakis | |
665 | - @pegomes | |
666 | - @schuster | |
667 | - @torkleyy | |
668 | ||
416331ca XL |
669 | |
670 | # Release 0.6 (2016-12-21) | |
2c00a5a8 XL |
671 | |
672 | This release includes a lot of progress towards the goal of parity | |
673 | with the sequential iterator API, though there are still a few methods | |
674 | that are not yet complete. If you'd like to help with that effort, | |
17df50a5 | 675 | [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) |
2c00a5a8 XL |
676 | to see the remaining issues. |
677 | ||
678 | **Announcement:** @cuviper has been added as a collaborator to the | |
679 | Rayon repository for all of his outstanding work on Rayon, which | |
680 | includes both internal refactoring and helping to shape the public | |
681 | API. Thanks @cuviper! Keep it up. | |
682 | ||
683 | - We now support `collect()` and not just `collect_with()`. | |
684 | You can use `collect()` to build a number of collections, | |
685 | including vectors, maps, and sets. Moreover, when building a vector | |
686 | with `collect()`, you are no longer limited to exact parallel iterators. | |
687 | Thanks @nikomatsakis, @cuviper! | |
688 | - We now support `skip()` and `take()` on parallel iterators. | |
689 | Thanks @martinhath! | |
690 | - **Breaking change:** We now match the sequential APIs for `min()` and `max()`. | |
691 | We also support `min_by_key()` and `max_by_key()`. Thanks @tapeinosyne! | |
692 | - **Breaking change:** The `mul()` method is now renamed to `product()`, | |
693 | to match sequential iterators. Thanks @jonathandturner! | |
416331ca | 694 | - We now support parallel iterator over ranges on `u64` values. Thanks @cuviper! |
2c00a5a8 XL |
695 | - We now offer a `par_chars()` method on strings for iterating over characters |
696 | in parallel. Thanks @cuviper! | |
697 | - We now have new demos: a traveling salesman problem solver as well as matrix | |
698 | multiplication. Thanks @nikomatsakis, @edre! | |
699 | - We are now documenting our minimum rustc requirement (currently | |
700 | v1.12.0). We will attempt to maintain compatibility with rustc | |
701 | stable v1.12.0 as long as it remains convenient, but if new features | |
702 | are stabilized or added that would be helpful to Rayon, or there are | |
703 | bug fixes that we need, we will bump to the most recent rustc. Thanks @cuviper! | |
704 | - The `reduce()` functionality now has better inlining. | |
705 | Thanks @bluss! | |
706 | - The `join()` function now has some documentation. Thanks @gsquire! | |
707 | - The project source has now been fully run through rustfmt. | |
708 | Thanks @ChristopherDavenport! | |
709 | - Exposed helper methods for accessing the current thread index. | |
710 | Thanks @bholley! | |
711 | ||
416331ca XL |
712 | |
713 | # Release 0.5 (2016-11-04) | |
2c00a5a8 XL |
714 | |
715 | - **Breaking change:** The `reduce` method has been vastly | |
716 | simplified, and `reduce_with_identity` has been deprecated. | |
717 | - **Breaking change:** The `fold` method has been changed. It used to | |
718 | always reduce the values, but now instead it is a combinator that | |
719 | returns a parallel iterator which can itself be reduced. See the | |
720 | docs for more information. | |
721 | - The following parallel iterator combinators are now available (thanks @cuviper!): | |
722 | - `find_any()`: similar to `find` on a sequential iterator, | |
723 | but doesn't necessarily return the *first* matching item | |
724 | - `position_any()`: similar to `position` on a sequential iterator, | |
725 | but doesn't necessarily return the index of *first* matching item | |
726 | - `any()`, `all()`: just like their sequential counterparts | |
727 | - The `count()` combinator is now available for parallel iterators. | |
728 | - We now build with older versions of rustc again (thanks @durango!), | |
729 | as we removed a stray semicolon from `thread_local!`. | |
730 | - Various improvements to the (unstable) `scope()` API implementation. | |
416331ca XL |
731 | |
732 | ||
733 | # Release 0.4.3 (2016-10-25) | |
2c00a5a8 XL |
734 | |
735 | - Parallel iterators now offer an adaptive weight scheme, | |
736 | which means that explicit weights should no longer | |
737 | be necessary in most cases! Thanks @cuviper! | |
738 | - We are considering removing weights or changing the weight mechanism | |
739 | before 1.0. Examples of scenarios where you still need weights even | |
740 | with this adaptive mechanism would be great. Join the discussion | |
17df50a5 | 741 | at <https://github.com/rayon-rs/rayon/issues/111>. |
2c00a5a8 XL |
742 | - New (unstable) scoped threads API, see `rayon::scope` for details. |
743 | - You will need to supply the [cargo feature] `unstable`. | |
744 | - The various demos and benchmarks have been consolidated into one | |
745 | program, `rayon-demo`. | |
416331ca | 746 | - Optimizations in Rayon's inner workings. Thanks @emilio! |
2c00a5a8 XL |
747 | - Update `num_cpus` to 1.0. Thanks @jamwt! |
748 | - Various internal cleanup in the implementation and typo fixes. | |
749 | Thanks @cuviper, @Eh2406, and @spacejam! | |
750 | ||
17df50a5 | 751 | [cargo feature]: https://doc.rust-lang.org/cargo/reference/features.html#the-features-section |
2c00a5a8 | 752 | |
416331ca XL |
753 | |
754 | # Release 0.4.2 (2016-09-15) | |
2c00a5a8 XL |
755 | |
756 | - Updated crates.io metadata. | |
757 | ||
416331ca XL |
758 | |
759 | # Release 0.4.1 (2016-09-14) | |
2c00a5a8 XL |
760 | |
761 | - New `chain` combinator for parallel iterators. | |
762 | - `Option`, `Result`, as well as many more collection types now have | |
763 | parallel iterators. | |
764 | - New mergesort demo. | |
765 | - Misc fixes. | |
766 | ||
767 | Thanks to @cuviper, @edre, @jdanford, @frewsxcv for their contributions! | |
768 | ||
416331ca XL |
769 | |
770 | # Release 0.4 (2016-05-16) | |
2c00a5a8 XL |
771 | |
772 | - Make use of latest versions of catch-panic and various fixes to panic propagation. | |
773 | - Add new prime sieve demo. | |
774 | - Add `cloned()` and `inspect()` combinators. | |
775 | - Misc fixes for Rust RFC 1214. | |
776 | ||
777 | Thanks to @areilb1, @Amanieu, @SharplEr, and @cuviper for their contributions! | |
778 | ||
416331ca XL |
779 | |
780 | # Release 0.3 (2016-02-23) | |
2c00a5a8 XL |
781 | |
782 | - Expanded `par_iter` APIs now available: | |
783 | - `into_par_iter` is now supported on vectors (taking ownership of the elements) | |
784 | - Panic handling is much improved: | |
785 | - if you use the Nightly feature, experimental panic recovery is available | |
786 | - otherwise, panics propagate out and poision the workpool | |
787 | - New `Configuration` object to control number of threads and other details | |
788 | - New demos and benchmarks | |
789 | - try `cargo run --release -- visualize` in `demo/nbody` :) | |
790 | - Note: a nightly compiler is required for this demo due to the | |
791 | use of the `+=` syntax | |
792 | ||
793 | Thanks to @bjz, @cuviper, @Amanieu, and @willi-kappler for their contributions! | |
794 | ||
416331ca | 795 | |
2c00a5a8 XL |
796 | # Release 0.2 and earlier |
797 | ||
798 | No release notes were being kept at this time. |