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ã§