最終更新日時:
が更新

履歴 編集

function template
<simd>

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

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("");
}

出力

0 1 10 11 

バージョン

言語

  • C++26

処理系

関連項目

参照