Skip to content

Latest commit

 

History

History
93 lines (73 loc) · 2.77 KB

File metadata and controls

93 lines (73 loc) · 2.77 KB

select

  • simd[meta header]
  • std::simd[meta namespace]
  • function template[meta id-type]
  • cpp26[meta cpp]
namespace std::simd {
  template<class T, class U>
  constexpr auto
    select(bool c,
           const T& a,
           const U& b)
    -> remove_cvref_t<decltype(c ? a : b)>;              // (1) C++26

  template<std::size_t Bytes, class Abi, class T, class U>
  constexpr auto
    select(const basic_mask<Bytes, Abi>& c,
           const T& a,
           const U& b)
    noexcept -> decltype(/*simd-select-impl*/(c, a, b)); // (2) C++26
}
  • basic_mask[link basic_mask.md]
  • remove_cvref_t[link /reference/type_traits/remove_cvref.md]

概要

条件に応じて2つの値のうちいずれかを選択する。条件演算子c ? a : bのデータ並列版である。

  • (1) : スカラー版。条件ctrueならaを、falseならbを返す

  • (2) : データ並列版。マスクcの各要素に応じて、trueの位置ではaの対応する要素を、falseの位置ではbの対応する要素を選択した結果を返す

  • c : 選択条件。(2) ではbasic_mask(比較演算子の結果など)

  • a : 条件がtrueのときに選択される値

  • b : 条件がfalseのときに選択される値

効果

  • (1) : return c ? a : b;と等価である
  • (2) : 実引数依存の名前探索(ADL)によって見つかる説明専用のsimd-select-impl(c, a, b)を返すことと等価である

戻り値

選択結果。(2) ではabの各要素をマスクに応じて選択したデータ並列型。

#include <simd>
#include <print>

namespace simd = std::simd;

int main()
{
  simd::vec<int, 4> a([](int i) { return i + 1; });        // {1, 2, 3, 4}
  simd::vec<int, 4> b([](int i) { return (i + 1) * 10; }); // {10, 20, 30, 40}

  // マスクの各要素に応じてa/bの要素を選択する
  auto mask = (a < 3);                // {true, true, false, false}
  auto r = simd::select(mask, a, b);  // {1, 2, 30, 40}

  for (int i = 0; i < r.size(); ++i) {
    std::print("{} ", r[i]);
  }
  std::println("");
}
  • simd::select[color ff0000]
  • simd::vec[link basic_vec.md]
  • r.size()[link basic_vec/size.md]

出力

1 2 30 40 

バージョン

言語

  • C++26

処理系

関連項目

参照