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) : スカラー版。条件
cがtrueなら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) ではaとbの各要素をマスクに応じて選択したデータ並列型。
例
#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
処理系
- Clang: 22 ❌
- GCC: 16.1 ❌
- Visual C++: 2026 Update 2 ❌
関連項目
参照
- P1928R15 std::simd — merge data-parallel types from the Parallelism TS 2
- C++26で
std::simdライブラリに追加された
- C++26で