最終更新日時:
が更新

履歴 編集

function template
<simd>

std::simd::select(C++26)

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
}

概要

条件に応じて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("");
}

出力

1 2 30 40 

バージョン

言語

  • C++26

処理系

関連項目

参照