template<class T, class Abi, class BinaryOperation = plus<>>
constexpr T reduce(const basic_simd<T, Abi>& x, BinaryOperation binary_op = {});
template<class T, class Abi, class BinaryOperation = plus<>>
constexpr T reduce(
const basic_simd<T, Abi>& x, const typename basic_simd<T, Abi>::mask_type& mask,
BinaryOperation binary_op = {}, type_identity_t<T> identity_element = see below);
template<class T, class Abi> constexpr T reduce_min(const basic_simd<T, Abi>& x) noexcept;
template<class T, class Abi>
constexpr T reduce_min(
const basic_simd<T, Abi>&, const typename basic_simd<T, Abi>::mask_type&) noexcept;
template<class T, class Abi> constexpr T reduce_max(const basic_simd<T, Abi>& x) noexcept;
template<class T, class Abi>
constexpr T reduce_max(
const basic_simd<T, Abi>&, const typename basic_simd<T, Abi>::mask_type&) noexcept;