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_vecやbasic_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
処理系
- 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で
- P3441R2 Rename
simd_splittosimd_chunk- 分割関数の名前が
simd_splitからchunkに改名された
- 分割関数の名前が