iron_simd.hsp
Version 3.8
Date 2026/04/18
Author IronHSP
目次 (6 グループ / 34 ページ)
iron_simd - CPU機能
iron_simd_cpu_name
CPU ブランド文字列の取得
CPUID の拡張ブランド文字列を取得します (例: "Intel(R) Core(TM)
i7-12700K CPU @ 3.60GHz")。
内部で 128 バイトの sdim を行い CPU 名を格納します。
iron_simd_has_avx
AVX 対応判定
AVX (256bit 浮動小数点 SIMD) 対応判定。OS レベルの YMM レジスタ
保存対応も XGETBV で確認済み。stat=1 なら AVX 実装を使用します。
iron_simd_has_avx2
AVX2 対応判定
AVX2 (256bit 整数 SIMD) 対応判定。
int 配列系の演算は AVX2 があるとフル速度で動作します。
stat=1 で対応。
iron_simd_has_avx512
AVX-512 対応判定
AVX-512 Foundation + OS ZMM 対応判定 (将来拡張用)。
現バージョンの hspsimd.dll は AVX-512 専用コードは持ちませんが、
情報取得のために提供されています。
iron_simd_has_sse
SSE 対応判定
SSE 命令セットを CPU が対応しているか返します。
x86-64 CPU では事実上常に 1。
stat = 1 なら対応、0 なら非対応。
iron_simd - double配列
iron_simd_add_d
double 配列の要素加算
out(i) = a(i) + b(i) を n 個まとめて計算します。
AVX があれば 4 個ずつ、SSE2 のみなら 2 個ずつ並列処理し、
残りはスカラで埋めます。in-place (a と out 同一) も可能。
iron_simd_div_d
double 配列の要素除算
out(i) = a(i) / b(i) を n 個まとめて計算。
b(i)=0 の結果は IEEE754 に従い +inf / -inf / NaN となります。
iron_simd_dot_d
double 配列の内積
result = Σ a(i) * b(i) を計算します。
AVX の場合 256bit アキュムレータに積和を蓄積し、最後に水平和。
浮動小数の総和順序は SIMD 内では並列化の都合で保証されず、
厳密に scalar と同じ値にはならない可能性があります (誤差範囲内)。
iron_simd_scale_d
double 配列のスカラ倍
out(i) = a(i) * scalar を計算します。
スカラはベクトルにブロードキャストされ、AVX で 4 要素並列。
iron_simd - float配列
iron_simd_add_f
float 配列の要素加算
32bit float 版。HSP は float 型を持たないため sdim でバイト列
として確保し varptr で渡します。通常は double 版を使う方が
簡便ですが、OpenGL / DirectX / WASM などの相互運用で float 配列が
必要な場合に使用します。
iron_simd - int配列
iron_simd_add_i
int 配列の要素加算
out(i) = a(i) + b(i)。AVX2 で 8 個並列、SSE2 で 4 個並列。
32bit のオーバーフローは切り捨て (ラップアラウンド)。
iron_simd_mul_i
int 配列の要素乗算
out(i) = a(i) * b(i) (下位 32bit)。AVX2 の _mm256_mullo_epi32 使用。
iron_simd_sum_i
int 配列の総和
result = Σ a(i)。内部は 64bit で累積しオーバーフローしても
正しく集計しますが、戻り値 result は int32 にクランプされます。
iron_simd - 画像
iron_simd_pixel_blend
2 画像のアルファブレンド
out(i) = a(i) * (1 - alpha) + b(i) * alpha を全バイトに適用します。
alpha=0 で a そのまま、alpha=1 で b そのまま。
AVX2 で 8 バイト単位に変換して並列計算。
UI のフェード効果や 2 画像クロスフェードに最適。
iron_simd_pixel_grayscale
RGBA → グレースケール変換
BT.601 輝度係数 (0.299R + 0.587G + 0.114B) で RGBA を単チャネル
グレースケールに変換します。out の長さは n/4 バイト。
iron_simd - 行列演算
iron_simd_matmul_d
double 行列積 C = A * B
double 版行列積。AVX で 4 列並列。
ddim で確保した row-major 配列を渡します。
iron_simd_matmul_f
float 行列積 C = A * B
row-major レイアウトで C = A * B を計算します (C は m 行 k 列)。
出力は常にゼロ初期化してから積和されます。
内ループで A の要素をブロードキャストし、B の行ベクトルと積和する
"broadcast + fma" スタイル。