Closed AlexGuteniev closed 3 weeks ago
We talked about this at the weekly maintainer meeting and we're in favor of implementing the ranges::minmax
value-based family with dedicated code in the core header <__msvc_minmax.hpp>
(currently only providing types), having <algorithm>
use that, and also having vector_algorithms.cpp
use that to implement _Minmax
(because the import lib can never shrink until vNext).
We should check the benchmark to make sure that this doesn't regress performance significantly.
From #4734 there's a conclusion that floating point types without /fp:fast
option should be vectorized with _element
approach. This has to be kept.
The compiler doesn't generate the _element
apporach, doesn't try to vectorize floating min/max at all, and currently even fails to apply the scalar approach properly, see DevCom-10686775.
As mentioned in #5010, it looks like keeping manual vectorization is best for now.
I now see that manually-vectorizing
ranges::minmax
in #4384 was not necessarily a good idea. Original implementation was implemented in terms ofminmax_element
and was not vectorized. But if it was implemented directly, it would have been vectorized. Consider the following:max1
is not vectorized, butmax2
is. see https://godbolt.org/z/fG6Yzfz4vSo we could just reimplement
ranges::max_element
in headers and enjoy vectorization with more context.Question how should we proceed: