最終更新日時:
が更新

履歴 編集

class template
<simd>

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

namespace std::simd {
  template<class T, class Abi = native-abi<T>>
  class basic_vec;

  template<class T, simd-size-type N = simd-size-v<T, native-abi<T>>>
  using vec = basic_vec<T, deduce-abi-t<T, N>>;
}

概要

basic_vecは、複数の値をまとめて保持し、それらに対する演算を一度に(データ並列に)適用するためのクラスである。SIMD(Single Instruction Stream, Multiple Data Stream)命令やSIMDレジスタといった、データ並列実行資源による高速化を活用することを意図している。

basic_vec<T, Abi>は、要素型T「vectorizable type」)の値を「width」(要素数)個だけ保持する。要素は0からwidth - 1まで添字付けされる。算術演算・比較演算などの各操作は、対応する要素同士に対して要素ごと(element-wise)に、互いに順序付けなく適用される。

通常は、要素数を明示的に指定できる別名vec<T, N>、または処理系が推奨する既定の要素数を用いるbasic_vec<T>を使用する。

  • T: 要素型。「vectorizable type」でなければならない
  • Abi: 要素数と内部表現を決定するABIタグ型。既定では処理系ネイティブのABIタグが選択される

vec<T, N>は、要素数をNに指定したbasic_vecの別名である。

有効な特殊化・無効な特殊化

basic_vec<T, Abi>の各特殊化は、「有効」(enabled)か「無効」(disabled)のいずれかである。T「vectorizable type」であり、Abi1以上64以下の要素数に対応するABIタグを表すとき、その特殊化は有効となる。有効なbasic_vecトリビアルコピー可能である。

無効な特殊化は、デフォルトコンストラクタ・デストラクタ・コピーコンストラクタ・コピー代入演算子がすべてdelete定義され、メンバとしてはvalue_typeabi_typemask_typeのみを持つ。

メンバ関数

構築/代入

名前 説明 対応バージョン
(constructor) コンストラクタ C++26
(destructor) デストラクタ(トリビアル) C++26

イテレータ

名前 説明 対応バージョン
begin 先頭要素を指すイテレータを取得する C++26
end 番兵を取得する C++26
cbegin 先頭要素を指す読み取り専用イテレータを取得する C++26
cend 番兵を取得する C++26

要素アクセス

名前 説明 対応バージョン
operator[] 要素または要素の並べ替えを取得する C++26
real 複素数要素の実部を取得/設定する C++26
imag 複素数要素の虚部を取得/設定する C++26

単項演算子

名前 説明 対応バージョン
operator++ インクリメント C++26
operator-- デクリメント C++26
operator! 論理反転 C++26
operator~ ビット反転 C++26
operator+ 単項プラス C++26
operator- 単項マイナス(符号反転) C++26

静的メンバ変数

名前 説明 対応バージョン
size 要素数(「width」)を表すstd::integral_constant C++26

メンバ型

名前 説明 対応バージョン
value_type 要素型T C++26
mask_type 対応するマスク型 basic_mask<sizeof(T), Abi> C++26
abi_type ABIタグ型Abi C++26
real-type 複素数要素のとき、実数型を要素とするbasic_vec(説明専用) C++26
iterator イテレータ型(説明専用) C++26
const_iterator 読み取り専用イテレータ型(説明専用) C++26

非メンバ(Hidden friends)関数

二項算術・ビット演算子

名前 説明 対応バージョン
operator+ 加算 C++26
operator- 減算 C++26
operator* 乗算 C++26
operator/ 除算 C++26
operator% 剰余 C++26
operator& ビット論理積 C++26
operator| ビット論理和 C++26
operator^ ビット排他的論理和 C++26
operator<< 左ビットシフト C++26
operator>> 右ビットシフト C++26

複合代入演算子

名前 説明 対応バージョン
operator+= 加算の複合代入 C++26
operator-= 減算の複合代入 C++26
operator*= 乗算の複合代入 C++26
operator/= 除算の複合代入 C++26
operator%= 剰余の複合代入 C++26
operator&= ビット論理積の複合代入 C++26
operator|= ビット論理和の複合代入 C++26
operator^= ビット排他的論理和の複合代入 C++26
operator<<= 左ビットシフトの複合代入 C++26
operator>>= 右ビットシフトの複合代入 C++26

比較演算子

名前 説明 対応バージョン
operator== 等値比較(結果はbasic_mask C++26
operator!= 非等値比較 C++26
operator>= 以上を判定する C++26
operator<= 以下を判定する C++26
operator> より大きいかを判定する C++26
operator< より小さいかを判定する C++26

推論補助

名前 説明 対応バージョン
(deduction_guide) クラステンプレートの推論補助 C++26

#include <simd>
#include <print>

namespace simd = std::simd;

int main()
{
  // 4要素のintデータ並列型
  simd::vec<int, 4> a([](int i) { return i + 1; });  // {1, 2, 3, 4}
  simd::vec<int, 4> b = 10;                          // {10, 10, 10, 10}

  // 要素ごとの加算
  simd::vec<int, 4> c = a + b;

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

出力

11 12 13 14 

バージョン

言語

  • C++26

処理系

関連項目

参照