最終更新日時:
が更新

履歴 編集

function template
<simd>

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

namespace std::simd {
  // 型Tと同じ要素数の断片へ分割する
  template<class T, class Abi>
  constexpr auto
    chunk(const basic_vec<typename T::value_type, Abi>& x) noexcept; // (1) C++26
  template<class T, class Abi>
  constexpr auto
    chunk(const basic_mask<mask-element-size<T>, Abi>& x) noexcept;  // (2) C++26

  // 要素数Nの断片へ分割する
  template<simd-size-type N, class T, class Abi>
  constexpr auto
    chunk(const basic_vec<T, Abi>& x) noexcept;       // (3) C++26
  template<simd-size-type N, std::size_t Bytes, class Abi>
  constexpr auto
    chunk(const basic_mask<Bytes, Abi>& x) noexcept;  // (4) C++26
}

概要

chunkは、大きなbasic_vecbasic_maskを、より小さなデータ並列オブジェクトへ分割する関数である。

  • (1), (2) : 分割後の断片の型Tを明示的に指定する。Tの要素数を単位として先頭から順に分割する
  • (3), (4) : 分割後の断片の要素数Nを指定する

元の要素数が断片の要素数で割り切れる場合は、すべての断片が同じ型となるため、std::arrayで返される。割り切れない場合は、末尾に端数の断片が付くため、std::tupleで返される。

逆に、複数のデータ並列オブジェクトを連結する操作はcatである。

戻り値

元のオブジェクトxを先頭から順に分割した断片の列。

  • 要素数が割り切れる場合 : すべての断片を格納したstd::array
  • 割り切れない場合 : 先頭の等分割された断片群と、末尾の端数の断片を格納したstd::tuple

例外

投げない

#include <simd>
#include <print>

namespace simd = std::simd;

int main()
{
  simd::vec<int, 8> v([](int i) { return i; });  // {0, 1, 2, 3, 4, 5, 6, 7}

  // 要素数4の断片2つに分割する(割り切れるのでarrayが返る)
  auto chunks = simd::chunk<4>(v);

  for (auto& c : chunks) {
    for (int i = 0; i < c.size(); ++i)
      std::print("{} ", c[i]);
    std::println("");
  }
}

出力

0 1 2 3 
4 5 6 7 

バージョン

言語

  • C++26

処理系

関連項目

参照