<simd>ヘッダでは、データ並列型(data-parallel types)のライブラリを提供する。SIMD命令やSIMDレジスタといったデータ並列実行資源を活用して、複数の値に対する演算を一度に適用するための型と操作を定義する。
このライブラリの機能はstd::simd名前空間で定義される。中心となる型は、ベクトル型basic_vec(および別名vec)と、マスク型basic_mask(および別名mask)である。
vectorizable type(ベクトル化可能型)
「vectorizable type」は、データ並列型(basic_vec・basic_mask)の要素型として使用できる型である。次の型が該当する。
- すべての標準の整数型・文字型、および
float・double(long doubleは含まない) std::float16_t・std::float32_t・std::float64_t(定義されている場合)- 要素型が浮動小数点数の「vectorizable type」である
std::complex
クラス
| 名前 | 説明 | 対応バージョン |
|---|---|---|
basic_vec |
データ並列のベクトル型 (class template) | C++26 |
vec |
要素数を指定するbasic_vecの別名 (alias template) |
C++26 |
basic_mask |
データ並列のマスク型 (class template) | C++26 |
mask |
要素数を指定するbasic_maskの別名 (alias template) |
C++26 |
flags |
読み込み/書き込みの動作フラグ (class template) | C++26 |
型特性
| 名前 | 説明 | 対応バージョン |
|---|---|---|
alignment |
読み込み/書き込みに必要なアライメントを取得する (class template) | C++26 |
rebind |
要素数を維持して要素型を変更する (class template) | C++26 |
resize |
要素型を維持して要素数を変更する (class template) | C++26 |
説明専用コンセプト
以下は規格の説明専用(exposition-only)のコンセプトであり、各関数のテンプレートパラメータ制約として使用される。規格の宣言では、math-floating-pointのように斜体のハイフン区切り名で示される。
| 名前 | 説明 | 対応バージョン |
|---|---|---|
simd-vec-type |
データ並列のベクトル型(basic_vecの特殊化)を表す (説明専用concept) |
C++26 |
simd-mask-type |
データ並列のマスク型(basic_maskの特殊化)を表す (説明専用concept) |
C++26 |
simd-floating-point |
要素型が浮動小数点数のbasic_vecを表す (説明専用concept) |
C++26 |
simd-integral |
要素型が整数のbasic_vecを表す (説明専用concept) |
C++26 |
simd-complex |
要素型が複素数のbasic_vecを表す (説明専用concept) |
C++26 |
math-floating-point |
数学関数向けに、浮動小数点数のbasic_vecまたはスカラーを表す (説明専用concept) |
C++26 |
explicitly-convertible-to |
型Fromが型Toへ明示的に変換可能であることを表す (説明専用concept) |
C++26 |
reduction-binary-operation |
reduceの二項演算として使用できることを表す (説明専用concept) |
C++26 |
説明専用の型・変数
以下は規格の説明専用(exposition-only)の型エイリアス・変数であり、宣言の記述に使用される。
| 名前 | 説明 | 対応バージョン |
|---|---|---|
simd-size-type |
要素数・インデックスを表す符号付き整数型 (説明専用type-alias) | C++26 |
deduced-vec-t |
型Tから導出されるデータ並列型(スカラーは対応するbasic_vec) (説明専用type-alias) |
C++26 |
simd-complex-value-type |
複素数要素の実数部・虚数部の型 (説明専用type-alias) | C++26 |
simd-size-v |
basic_vecの幅(要素数) (説明専用variable) |
C++26 |
mask-size-v |
basic_maskの幅(要素数) (説明専用variable) |
C++26 |
mask-element-size |
basic_maskの要素1つが対応するバイトサイズ (説明専用variable) |
C++26 |
native-abi |
要素型Tに対する既定のABIタグ (説明専用type-alias) |
C++26 |
deduce-abi-t |
要素型Tと要素数Nから導出されるABIタグ (説明専用type-alias) |
C++26 |
集計
| 名前 | 説明 | 対応バージョン |
|---|---|---|
reduce |
全要素を二項演算で集計し、単一の値を求める (function template) | C++26 |
reduce_min |
全要素の最小値を求める (function template) | C++26 |
reduce_max |
全要素の最大値を求める (function template) | C++26 |
all_of |
マスクの全要素がtrueかを判定する (function template) |
C++26 |
any_of |
マスクのいずれかの要素がtrueかを判定する (function template) |
C++26 |
none_of |
マスクの全要素がfalseかを判定する (function template) |
C++26 |
reduce_count |
マスクのtrueである要素数を数える (function template) |
C++26 |
reduce_min_index |
マスクで最初にtrueとなる要素のインデックスを求める (function template) |
C++26 |
reduce_max_index |
マスクで最後にtrueとなる要素のインデックスを求める (function template) |
C++26 |
読み込み/書き込み
| 名前 | 説明 | 対応バージョン |
|---|---|---|
unchecked_load |
メモリから要素をまとめて読み込む(境界チェックなし) (function template) | C++26 |
partial_load |
メモリから要素を安全にまとめて読み込む(範囲外は値初期化) (function template) | C++26 |
unchecked_store |
全要素をメモリへまとめて書き込む(境界チェックなし) (function template) | C++26 |
partial_store |
要素をメモリへ安全にまとめて書き込む(範囲外は書き込まない) (function template) | C++26 |
unchecked_gather_from |
インデックスで指定した飛び飛びの位置から要素を集めて読み込む(境界チェックなし) (function template) | C++26 |
partial_gather_from |
インデックスで指定した飛び飛びの位置から要素を安全に集めて読み込む (function template) | C++26 |
unchecked_scatter_to |
各要素をインデックスで指定した飛び飛びの位置へ書き出す(境界チェックなし) (function template) | C++26 |
partial_scatter_to |
各要素をインデックスで指定した飛び飛びの位置へ安全に書き出す (function template) | C++26 |
要素の置換・生成
| 名前 | 説明 | 対応バージョン |
|---|---|---|
permute |
要素を指定したインデックスのマッピングに従って並べ替える (function template) | C++26 |
compress |
マスクがtrueである要素だけを先頭に詰める (function template) |
C++26 |
expand |
先頭に詰められた要素をマスクがtrueである位置へ展開する (function template) |
C++26 |
chunk |
大きなデータ並列オブジェクトを小さなオブジェクトへ分割する (function template) | C++26 |
cat |
複数のデータ並列オブジェクトを連結する (function template) | C++26 |
select |
条件に応じて2つの値のうちいずれかを要素ごとに選択する (function template) | C++26 |
iota |
各要素がインデックスに等しい連番(0, 1, 2, …)を表す定数 (variable template) |
C++29 |
アルゴリズム
| 名前 | 説明 | 対応バージョン |
|---|---|---|
min |
2つのオブジェクトを要素ごとに比較して小さいほうを返す (function template) | C++26 |
max |
2つのオブジェクトを要素ごとに比較して大きいほうを返す (function template) | C++26 |
minmax |
要素ごとの最小値と最大値をまとめて取得する (function template) | C++26 |
clamp |
各要素を指定した範囲に収める (function template) | C++26 |
数学関数
| 名前 | 説明 | 対応バージョン |
|---|---|---|
exp |
各要素に指数関数を適用する (function template) | C++26 |
exp2 |
各要素に2を底とする指数関数を適用する (function template) | C++26 |
expm1 |
各要素にe^x - 1を適用する (function template) |
C++26 |
log |
各要素に自然対数を適用する (function template) | C++26 |
log10 |
各要素に常用対数を適用する (function template) | C++26 |
log2 |
各要素に2を底とする対数を適用する (function template) | C++26 |
log1p |
各要素にlog(1 + x)を適用する (function template) |
C++26 |
pow |
各要素の累乗を求める (function template) | C++26 |
sqrt |
各要素の平方根を求める (function template) | C++26 |
cbrt |
各要素の立方根を求める (function template) | C++26 |
hypot |
各要素の平方和の平方根(斜辺の長さ)を求める (function template) | C++26 |
sin |
各要素の正弦を求める (function template) | C++26 |
cos |
各要素の余弦を求める (function template) | C++26 |
tan |
各要素の正接を求める (function template) | C++26 |
asin |
各要素の逆正弦を求める (function template) | C++26 |
acos |
各要素の逆余弦を求める (function template) | C++26 |
atan |
各要素の逆正接を求める (function template) | C++26 |
atan2 |
各要素についてy/xの逆正接を象限を考慮して求める (function template) |
C++26 |
sinh |
各要素の双曲線正弦を求める (function template) | C++26 |
cosh |
各要素の双曲線余弦を求める (function template) | C++26 |
tanh |
各要素の双曲線正接を求める (function template) | C++26 |
asinh |
各要素の逆双曲線正弦を求める (function template) | C++26 |
acosh |
各要素の逆双曲線余弦を求める (function template) | C++26 |
atanh |
各要素の逆双曲線正接を求める (function template) | C++26 |
abs |
各要素の絶対値を求める (function template) | C++26 |
fabs |
各要素の絶対値を求める(浮動小数点数) (function template) | C++26 |
fmod |
各要素の浮動小数点剰余を求める (function template) | C++26 |
remainder |
各要素のIEEE浮動小数点剰余を求める (function template) | C++26 |
remquo |
各要素のIEEE剰余と商の下位ビットを求める (function template) | C++26 |
fma |
各要素の積和演算x*y+zを1回の丸めで求める (function template) |
C++26 |
fmax |
各要素の大きいほうの値を求める (function template) | C++26 |
fmin |
各要素の小さいほうの値を求める (function template) | C++26 |
fdim |
各要素の正の差(x-yが正ならその値、それ以外は0)を求める (function template) |
C++26 |
ceil |
各要素を切り上げる (function template) | C++26 |
floor |
各要素を切り捨てる (function template) | C++26 |
trunc |
各要素を0方向へ切り捨てる (function template) | C++26 |
round |
各要素を四捨五入する (function template) | C++26 |
nearbyint |
各要素を現在の丸めモードで整数に丸める (function template) | C++26 |
rint |
各要素を現在の丸めモードで整数に丸める (function template) | C++26 |
lrint |
各要素を現在の丸めモードでlongの整数に丸める (function template) |
C++26 |
llrint |
各要素を現在の丸めモードでlong longの整数に丸める (function template) |
C++26 |
lround |
各要素を四捨五入してlongにする (function template) |
C++26 |
llround |
各要素を四捨五入してlong longにする (function template) |
C++26 |
lerp |
各要素を線形補間する (function template) | C++26 |
frexp |
各要素を仮数部と指数部に分解する (function template) | C++26 |
ldexp |
各要素に2の累乗を掛ける (function template) | C++26 |
modf |
各要素を整数部と小数部に分解する (function template) | C++26 |
scalbn |
各要素に基数FLT_RADIXの累乗を掛ける (function template) |
C++26 |
scalbln |
各要素に基数FLT_RADIXの累乗を掛ける (function template) |
C++26 |
ilogb |
各要素の指数部を整数で求める (function template) | C++26 |
logb |
各要素の指数部を求める (function template) | C++26 |
nextafter |
各要素の次に表現可能な値を求める (function template) | C++26 |
copysign |
各要素の大きさに別の値の符号を合成する (function template) | C++26 |
erf |
各要素の誤差関数を求める (function template) | C++26 |
erfc |
各要素の相補誤差関数を求める (function template) | C++26 |
lgamma |
各要素のガンマ関数の絶対値の自然対数を求める (function template) | C++26 |
tgamma |
各要素のガンマ関数を求める (function template) | C++26 |
数学関数(分類・比較)
| 名前 | 説明 | 対応バージョン |
|---|---|---|
fpclassify |
各要素の浮動小数点数分類を求める (function template) | C++26 |
isfinite |
各要素が有限値かを判定する (function template) | C++26 |
isinf |
各要素が無限大かを判定する (function template) | C++26 |
isnan |
各要素がNaNかを判定する (function template) | C++26 |
isnormal |
各要素が正規化数かを判定する (function template) | C++26 |
signbit |
各要素の符号ビットが立っているかを判定する (function template) | C++26 |
isgreater |
各要素についてx > yかを判定する (function template) |
C++26 |
isgreaterequal |
各要素についてx >= yかを判定する (function template) |
C++26 |
isless |
各要素についてx < yかを判定する (function template) |
C++26 |
islessequal |
各要素についてx <= yかを判定する (function template) |
C++26 |
islessgreater |
各要素についてx < y || x > yかを判定する (function template) |
C++26 |
isunordered |
各要素が順序付けできない(いずれかがNaN)かを判定する (function template) | C++26 |
数学関数(特殊関数)
| 名前 | 説明 | 対応バージョン |
|---|---|---|
assoc_laguerre |
各要素にラゲール陪多項式を適用する (function template) | C++26 |
assoc_legendre |
各要素にルジャンドル陪関数を適用する (function template) | C++26 |
beta |
各要素にベータ関数を適用する (function template) | C++26 |
comp_ellint_1 |
各要素に第一種完全楕円積分を適用する (function template) | C++26 |
comp_ellint_2 |
各要素に第二種完全楕円積分を適用する (function template) | C++26 |
comp_ellint_3 |
各要素に第三種完全楕円積分を適用する (function template) | C++26 |
cyl_bessel_i |
各要素に第一種変形ベッセル関数を適用する (function template) | C++26 |
cyl_bessel_j |
各要素に第一種ベッセル関数を適用する (function template) | C++26 |
cyl_bessel_k |
各要素に第二種変形ベッセル関数を適用する (function template) | C++26 |
cyl_neumann |
各要素に第二種ベッセル関数(ノイマン関数)を適用する (function template) | C++26 |
ellint_1 |
各要素に第一種不完全楕円積分を適用する (function template) | C++26 |
ellint_2 |
各要素に第二種不完全楕円積分を適用する (function template) | C++26 |
ellint_3 |
各要素に第三種不完全楕円積分を適用する (function template) | C++26 |
expint |
各要素に指数積分を適用する (function template) | C++26 |
hermite |
各要素にエルミート多項式を適用する (function template) | C++26 |
laguerre |
各要素にラゲール多項式を適用する (function template) | C++26 |
legendre |
各要素にルジャンドル多項式を適用する (function template) | C++26 |
riemann_zeta |
各要素にリーマンゼータ関数を適用する (function template) | C++26 |
sph_bessel |
各要素に第一種球ベッセル関数を適用する (function template) | C++26 |
sph_legendre |
各要素に球面調和関数のルジャンドル陪関数部分を適用する (function template) | C++26 |
sph_neumann |
各要素に第二種球ベッセル関数(球ノイマン関数)を適用する (function template) | C++26 |
ビット操作
| 名前 | 説明 | 対応バージョン |
|---|---|---|
byteswap |
各要素のバイト順を反転する (function template) | C++26 |
has_single_bit |
各要素が2の累乗(1ビットのみ)かを判定する (function template) | C++26 |
bit_ceil |
各要素以上で最小の2の累乗を求める (function template) | C++26 |
bit_floor |
各要素以下で最大の2の累乗を求める (function template) | C++26 |
bit_width |
各要素を表現するのに必要なビット数を求める (function template) | C++26 |
rotl |
各要素を左に循環ビットシフトする (function template) | C++26 |
rotr |
各要素を右に循環ビットシフトする (function template) | C++26 |
countl_zero |
各要素の最上位から連続する0ビットの数を数える (function template) | C++26 |
countl_one |
各要素の最上位から連続する1ビットの数を数える (function template) | C++26 |
countr_zero |
各要素の最下位から連続する0ビットの数を数える (function template) | C++26 |
countr_one |
各要素の最下位から連続する1ビットの数を数える (function template) | C++26 |
popcount |
各要素の1になっているビットの数を数える (function template) | C++26 |
bit_compress |
各要素について、マスクのビットが立つ位置の値を下位へ詰める (function template) | C++29 |
bit_expand |
各要素について、下位ビットをマスクのビットが立つ位置へ展開する (function template) | C++29 |
bit_reverse |
各要素のビット列の並びを反転する (function template) | C++29 |
bit_repeat |
各要素の最下位lビットのパターンを幅いっぱいに繰り返す (function template) |
C++29 |
shl |
各要素を論理左シフトする (function template) | C++29 |
shr |
各要素を論理右シフトする (function template) | C++29 |
複素数
| 名前 | 説明 | 対応バージョン |
|---|---|---|
real |
各要素の実部を取得する (function template) | C++26 |
imag |
各要素の虚部を取得する (function template) | C++26 |
arg |
各要素の偏角を求める (function template) | C++26 |
norm |
各要素のノルム(絶対値の2乗)を求める (function template) | C++26 |
conj |
各要素の共役複素数を求める (function template) | C++26 |
proj |
各要素をリーマン球面へ射影する (function template) | C++26 |
polar |
絶対値と偏角から複素数を生成する (function template) | C++26 |
バージョン
言語
- 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で
<simd>ヘッダが追加された
- C++26で