[Bug libstdc++/101274] [11/12 Regression] std::execution::seq has incorrect behaviour under GCC 11.1.0
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101274 --- Comment #6 from Thomas Rodgers --- It does raise an issue which I'm going to follow up on separately on the SG1 (concurrency and parallelism study group) mailing list. While it is indeed the case that standard says you can't count on deterministic sequencing for std::reduce(), I can't find any wording that directly supports the wording on cppreference.com std::execution::sequenced_policy, though that wording is consistent with my recollection of SG1's discussions regarding execution policies. There is wording that says 'Unless otherwise specified, the semantics of ExecutionPolicy algorithm overloads are identical to their overloads without." The wording for std::for_each() for the non-execution policy overload the standard says - Effects: Applies f to the result of dereferencing every iterator in the range [first, last), starting from first and proceeding to last - 1. And for one that takes an execution policy - Effects: Applies f to the result of dereferencing every iterator in the range [first, last). So it omits the ordering constraint, which makes sense, but I wonder if we shouldn't be more explicit in the documentation of the policies themselves.
[Bug libstdc++/101274] [11/12 Regression] std::execution::seq has incorrect behaviour under GCC 11.1.0
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101274 --- Comment #5 from yhf8377 --- Thank you Thomas for the detailed information and links to the references. I guess I will need to move this bug report into our own bug tracker. :-) This is indeed a bug in our code as we had incorrect assumptions on how `std::reduce()` and `std::execution::seq` work. Thanks again!
[Bug libstdc++/101274] [11/12 Regression] std::execution::seq has incorrect behaviour under GCC 11.1.0
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101274 --- Comment #4 from Thomas Rodgers --- I did some more reading of http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4878.pdf and it would seem that you are not even guaranteed a deterministic ordering of the application of binary_op on the non-execution policy accepting overloads of std::reduce(). See [reduce] the note at bullet 9 - "[Note 1 : The difference between reduce and accumulate is that reduce applies binary_op in an unspecified order, which yields a nondeterministic result for non-associative or non-commutative binary_op such as floating-point addition. — end note]"
[Bug libstdc++/101274] [11/12 Regression] std::execution::seq has incorrect behaviour under GCC 11.1.0
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101274 Thomas Rodgers changed: What|Removed |Added Status|NEW |RESOLVED Resolution|--- |INVALID --- Comment #3 from Thomas Rodgers --- The standard only requires that the the parallel algorithm's execution, when invoked with std::sequenced_policy, be invoked on the calling thread, and (as with the other execution policies) allows for the invocations of element access functions to be indeterminately sequenced on the execution agent. This is also spelled at - https://en.cppreference.com/w/cpp/algorithm/execution_policy_tag_t "1) The execution policy type used as a unique type to disambiguate parallel algorithm overloading and require that a parallel algorithm's execution may not be parallelized. The invocations of element access functions in parallel algorithms invoked with this policy (usually specified as std::execution::seq) are indeterminately sequenced in the calling thread."
[Bug libstdc++/101274] [11/12 Regression] std::execution::seq has incorrect behaviour under GCC 11.1.0
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101274 Martin Liška changed: What|Removed |Added CC||marxin at gcc dot gnu.org Ever confirmed|0 |1 Status|UNCONFIRMED |NEW Last reconfirmed||2021-07-01 --- Comment #2 from Martin Liška --- Confirmed.
[Bug libstdc++/101274] [11/12 Regression] std::execution::seq has incorrect behaviour under GCC 11.1.0
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101274 Richard Biener changed: What|Removed |Added Keywords||wrong-code Summary|std::execution::seq has |[11/12 Regression] |incorrect behaviour under |std::execution::seq has |GCC 11.1.0 |incorrect behaviour under ||GCC 11.1.0 Target Milestone|--- |11.2