- simd[meta header]
- std::simd[meta namespace]
- function template[meta id-type]
- cpp26[meta cpp]
namespace std::simd {
template<class T, class... Abis>
constexpr resize_t<
(basic_vec<T, Abis>::size() + ...),
basic_vec<T, Abis...[0]>
>
cat(const basic_vec<T, Abis>&... xs) noexcept; // (1) C++26
template<std::size_t Bytes, class... Abis>
constexpr resize_t<
(basic_mask<Bytes, Abis>::size() + ...),
basic_mask<Bytes, Abis...[0]>
>
cat(const basic_mask<Bytes, Abis>&... xs) noexcept; // (2) C++26
}catは、複数のbasic_vec((1))またはbasic_mask((2))を連結して、1つの大きなデータ並列オブジェクトを生成する関数である。
引数として渡したオブジェクトが、引数の順に前から並べられる。結果の要素数は、各引数の要素数の総和となる。
逆に、大きなデータ並列オブジェクトを分割する操作はchunkである。
引数xsを順に連結したデータ並列オブジェクト。j番目の引数のi番目の要素は、結果のうち「i + 先頭からj番目までの引数の要素数の合計」の位置へコピーされる。
投げない
#include <simd>
#include <print>
namespace simd = std::simd;
int main()
{
simd::vec<int, 2> a([](int i) { return i; }); // {0, 1}
simd::vec<int, 2> b([](int i) { return i + 10; }); // {10, 11}
// 2つのvecを連結して要素数4のvecを得る
auto r = simd::cat(a, b); // {0, 1, 10, 11}
for (int i = 0; i < r.size(); ++i)
std::print("{} ", r[i]);
std::println("");
}- simd::cat[color ff0000]
- simd::vec[link basic_vec.md]
0 1 10 11
- C++26
- Clang: 22 [mark noimpl]
- GCC: 16.1 [mark noimpl]
- Visual C++: 2026 Update 2 [mark noimpl]
- P1928R15 std::simd — merge data-parallel types from the Parallelism TS 2
- C++26で
std::simdライブラリが追加された
- C++26で
- P3932R0 Fix LWG4470: Fix integer-from in simd
- 戻り値型が
resize_tを用いて規定し直された(complex<double>が「vectorizable type」に加わったことによるinteger-fromの不具合を修正)
- 戻り値型が