最終更新日時:
が更新

履歴 編集

variable
<simd>

std::simd::iota(C++29)

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幅に応じてスケールする形でこの定数を記述できる。スケールやオフセットを組み合わせて任意の等差数列を作れる。

  • Tbasic_vecの場合: 各要素がそのインデックスに等しいデータ並列オブジェクト({0, 1, …, T::size() - 1})となる。
  • Tがスカラーの算術型の場合: 値0T())となる。SIMD-genericなコードで、データ並列型とスカラーを統一的に扱うための縮退ケースである。

適格要件

次のいずれかを満たすこと。

#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

処理系

関連項目

参照