Should ranges::minmax
be auto-vectorized instead of manual vectorization. · Issue #4453 · microsoft/STL (original) (raw)
I now see that manually-vectorizing ranges::minmax
in #4384 was not necessarily a good idea.
Original implementation was implemented in terms of minmax_element
and was not vectorized.
But if it was implemented directly, it would have been vectorized.
Consider the following:
unsigned int* max_element(unsigned intb, unsigned int e){ unsigned int m = b; unsigned int r = b; for (++b; b != e; ++b){ if (m < *b) { m = *b; r = b; } } return b; }
unsigned int max1(unsigned intb, unsigned int e){ return *max_element(b, e); }
unsigned int max2(unsigned int b, unsigned int e){ unsigned int m = *b; for (++b; b != e; ++b){ if (m < *b) { m = *b; } } return m; }
max1
is not vectorized, but max2
is. see https://godbolt.org/z/fG6Yzfz4v
So we could just reimplement ranges::max_element
in headers and enjoy vectorization with more context.
Question how should we proceed:
- Keep manual vectorization forever
- Drop it in vNext
- Drop it any time