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」であり、Abiが1以上64以下の要素数に対応するABIタグを表すとき、その特殊化は有効となる。有効なbasic_vecはトリビアルコピー可能である。
無効な特殊化は、デフォルトコンストラクタ・デストラクタ・コピーコンストラクタ・コピー代入演算子がすべてdelete定義され、メンバとしてはvalue_type・abi_type・mask_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
処理系
- 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で
- P3287R3 Exploration of namespaces for
std::simdstd::simd名前空間に配置することが検討された
- P3691R1 Reconsider naming of the namespace for "std::simd"
- 名前空間を
std::simdとし、主要クラスをbasic_vec/vecに改名した
- 名前空間を
- P2876R3 Proposal to extend
std::simdwith more constructors and accessors- コンストラクタとアクセサが追加された
- P3480R6
std::simdis a range- イテレータを追加し、Rangeとして扱えるようになった