namespace std::simd {
template<class T, class Abi>
constexpr T
reduce_max(const basic_vec<T, Abi>& x) noexcept; // (1) C++26
template<class T, class Abi>
constexpr T
reduce_max(const basic_vec<T, Abi>& x,
const typename basic_vec<T, Abi>::mask_type& mask) noexcept; // (2) C++26
template<class T>
constexpr T
reduce_max(const T& x) noexcept; // (3) C++26
template<class T>
constexpr T
reduce_max(const T& x,
std::same_as<bool> auto mask) noexcept; // (4) C++26
}
概要
basic_vecの要素のうち、最大の値を取得する。
- (1) :
xの全要素の最大値を返す。 - (2) :
maskで選択された要素の最大値を返す。ひとつも選択されていない場合はTの最小値を返す。 - (3) : スカラー値
xをそのまま返す(SIMD-genericなコードを書けるようにするためのオーバーロード)。 - (4) :
maskがtrueならxを、falseならTの最小値を返す。
テンプレートパラメータ制約
- (1), (2) :
Tがstd::totally_orderedのモデルであること - (3), (4) :
Tが「vectorizable type」であり、かつstd::totally_orderedのモデルであること
戻り値
- (1) : すべての
i(0以上x.size()未満)についてx[j] < x[i]がfalseとなるような要素x[j]の値を返す。 - (2) :
none_of(mask)がtrueならstd::numeric_limits<T>::lowest()を返す。そうでなければ、maskで選択されたすべてのインデックスiについてx[j] < x[i]がfalseとなるような選択要素x[j]の値を返す。 - (3) :
xを返す。 - (4) :
maskがfalseならstd::numeric_limits<T>::lowest()を、そうでなければxを返す。
例外
投げない
例
#include <simd>
#include <print>
namespace simd = std::simd;
int main()
{
simd::vec<int, 4> v([](int i) { return i; }); // {0, 1, 2, 3}
// 全要素の最大値
std::println("{}", simd::reduce_max(v));
// 選択された要素(値が2未満)の最大値
std::println("{}", simd::reduce_max(v, v < 2));
}
出力
3
1
バージョン
言語
- C++26
処理系
- Clang: 22 ❌
- GCC: 16.1 ❌
- Visual C++: 2026 Update 2 ❌
関連項目
参照
- P1928R15 std::simd — merge data-parallel types from the Parallelism TS 2
- C++26で追加された
- P3690R1 Consistency fix: Make simd reductions SIMD-generic
- スカラー「vectorizable type」を受け取るオーバーロード (3), (4) が追加され、SIMD-genericなコードを書けるようになった