最終更新日時:
が更新

履歴 編集

function template
<simd>

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

namespace std::simd {
  template<class V = /*see below*/,
           ranges::contiguous_range R,
           simd-integral I,
           class... Flags>
    requires ranges::sized_range<R>
  constexpr V
    unchecked_gather_from(R&& in,
                          const I& indices,
                          flags<Flags...> f = {}); // (1) C++26

  template<class V = /*see below*/,
           ranges::contiguous_range R,
           simd-integral I,
           class... Flags>
    requires ranges::sized_range<R>
  constexpr V
    unchecked_gather_from(R&& in,
                          const typename I::mask_type& mask,
                          const I& indices,
                          flags<Flags...> f = {}); // (2) C++26
}

概要

連続したメモリ領域inから、インデックスを表すデータ並列型indicesで指定した飛び飛びの位置の要素を集めて(gather)、basic_vecへ読み込む。結果のi番目の要素は、inindices[i]番目の要素となる。境界チェックをおこなわない高速なgatherである。

  • (1) : 全要素を集める
  • (2) : maskの各要素がtrueである位置の要素のみを集め、falseの位置は値初期化された値(0など)とする

  • V : 結果のデータ並列型。省略した場合はvec<std::ranges::range_value_t<R>, I::size()>が使われる

  • indices : 各要素が読み込み位置のインデックスを表す、整数要素のデータ並列型
  • f : gatherの動作を指定するflagsオブジェクト。既定値はflag_default。要素型が異なるメモリからの変換読み込みを許可するflag_convertや、メモリのアライメントを仮定するflag_alignedflag_overaligned<N>を指定できる

事前条件

select(mask, indices, typename I::value_type())のすべての値が、範囲[0, std::ranges::size(in))に含まれること。

効果

partial_gather_from<V>(in, mask, indices, f)を返すことと等価である。ただし (1) ではmasktypename I::mask_type(true)(すべてtrue)とみなす。

戻り値

集めた結果のbasic_vecオブジェクト。

#include <simd>
#include <array>
#include <print>

namespace simd = std::simd;

int main()
{
  std::array<int, 8> data = {10, 11, 12, 13, 14, 15, 16, 17};

  // インデックス {0, 2, 4, 6} の位置の要素を集める
  simd::vec<int, 4> indices([](int i) { return i * 2; });

  auto v = simd::unchecked_gather_from<simd::vec<int, 4>>(data, indices);

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

出力

10 12 14 16 

バージョン

言語

  • C++26

処理系

関連項目

参照