最終更新日時:
が更新

履歴 編集

<simd>

simd(C++26)

<simd>ヘッダでは、データ並列型(data-parallel types)のライブラリを提供する。SIMD命令やSIMDレジスタといったデータ並列実行資源を活用して、複数の値に対する演算を一度に適用するための型と操作を定義する。

このライブラリの機能はstd::simd名前空間で定義される。中心となる型は、ベクトル型basic_vec(および別名vec)と、マスク型basic_mask(および別名mask)である。

vectorizable type(ベクトル化可能型)

「vectorizable type」は、データ並列型(basic_vecbasic_mask)の要素型として使用できる型である。次の型が該当する。

クラス

名前 説明 対応バージョン
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

処理系

参照