Skip to content

Latest commit

 

History

History
99 lines (77 loc) · 3.28 KB

File metadata and controls

99 lines (77 loc) · 3.28 KB

chunk

  • simd[meta header]
  • std::simd[meta namespace]
  • function template[meta id-type]
  • cpp26[meta cpp]
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
}
  • simd-size-type[link /reference/simd/simd-size-type.md]
  • mask-element-size[link /reference/simd/mask-element-size.md]

概要

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("");
  }
}
  • simd::chunk[color ff0000]
  • simd::vec[link basic_vec.md]

出力

0 1 2 3 
4 5 6 7 

バージョン

言語

  • C++26

処理系

関連項目

参照