namespace std::simd {
template<class T>
constexpr T iota = /*see below*/;
}
概要
iotaは、0, 1, 2, …という連番を要素とするデータ並列オブジェクトを表す変数テンプレートである。
SIMDプログラミングでは、各レーンのインデックスに相当する連番0, 1, 2, …が頻出する。iotaを使うと、ジェネレータコンストラクタ(vec<int>([](int i) { return i; }))よりも簡潔に、かつSIMD幅に応じてスケールする形でこの定数を記述できる。スケールやオフセットを組み合わせて任意の等差数列を作れる。
Tがbasic_vecの場合: 各要素がそのインデックスに等しいデータ並列オブジェクト({0, 1, …, T::size() - 1})となる。Tがスカラーの算術型の場合: 値0(T())となる。SIMD-genericなコードで、データ並列型とスカラーを統一的に扱うための縮退ケースである。
適格要件
次のいずれかを満たすこと。
Tが「vectorizable type」であり、std::is_arithmetic_v<T>がtrueであることTがbasic_vecの有効な特殊化であり、std::is_arithmetic_v<typename T::value_type>がtrueであり、かつT::size() - 1がstd::numeric_limits<typename T::value_type>::max()以下であること(連番が要素型で表現でき、オーバーフローしないこと)
例
#include <simd>
#include <print>
namespace simd = std::simd;
int main()
{
// 各要素がインデックスに等しい連番
simd::vec<int, 4> a = simd::iota<simd::vec<int, 4>>; // {0, 1, 2, 3}
// スケールとオフセットを適用した等差数列
simd::vec<int, 4> b = 2 + 3 * simd::iota<simd::vec<int, 4>>; // {2, 5, 8, 11}
for (int i = 0; i < a.size(); ++i)
std::print("{} ", a[i]);
std::println("");
for (int i = 0; i < b.size(); ++i)
std::print("{} ", b[i]);
std::println("");
}
出力
0 1 2 3
2 5 8 11
バージョン
言語
- C++29
処理系
- Clang: 22 ❌
- GCC: 16.1 ❌
- Visual C++: 2026 Update 2 ❌
関連項目
参照
- P3319R6 Add an iota object for simd (and more)
- C++29で追加された