nuget server logo nuget api documents
↑

API Docs / Microsoft.VisualBasic.Runtime / SimdReduce

SimdReduce

Full name Microsoft.VisualBasic.Math.SIMD.SimdReduce Assembly Microsoft.VisualBasic.Runtime Members 18

归约运算(把整个向量折叠成一个标量)。

00 Remarks

与 SimdEngine 不同,这里的函数会校验输入长度并抛出 ArgumentException:归约运算的长度不一致是调用方的逻辑错误, 静默截断只会带来更难定位的数值 bug。

求和/点积类内核使用 4 路累加器来打断浮点加法的依赖链(vaddpd 的 延时大约是 3~4 个周期,单累加器会让吞吐被延时吃满),在长数组上可以拿到 接近 4 倍的额外提升。

01 Syntax

Microsoft.VisualBasic.Math.SIMD.SimdReduce

02 Methods

NameOverloadsSummary
Sum 2 求和:SUM(v)。空数组返回 0。
SumScalar 1 单线程标量求和(同时用作纯标量回退路径)。
SumSquares 1 平方和:SUM(v(i) ^ 2)。空数组返回 0。
Dot 2 点积:SUM(v1(i) * v2(i))。
Min 2 求 [start, ends) 区间(前闭后开)的最小值。
Max 3 求 [start, ends) 区间(前闭后开)的最大值。
Mean 2 均值:SUM(v) / N。空数组会抛出 ArgumentException。
L1Norm 2 求 [start, ends) 区间(前闭后开)的 L1 范数。
L2Norm 1 L2 范数(欧几里得范数):SQRT(SUM(v(i) ^ 2))。空数组返回 0。
ArgMax 1 最大值所在的下标(第一个匹配项)。空数组会抛出 ArgumentException。
ArgMin 1 最小值所在的下标(第一个匹配项)。空数组会抛出 ArgumentException。

03 Members

method Sum #
Sum(Double())

求和:SUM(v)。空数组返回 0。

method Sum overload 2 #
Sum(Single())

求和:SUM(v)。空数组返回 0。

method SumScalar #
SumScalar(Double(), Int32, Int32)

单线程标量求和(同时用作纯标量回退路径)。

method SumSquares #
SumSquares(Double())

平方和:SUM(v(i) ^ 2)。空数组返回 0。

method Dot #
Dot(Double(), Double())

点积:SUM(v1(i) * v2(i))。

Remarks

这个实现不使用 FMA 指令(以保持与 SIMDIntrinsics.DotFma() 的依赖方向单纯,避免相互递归);需要 FMA 版本请直接调用 SIMDIntrinsics.DotFma(), 它会在这个实现之上自动选择更快的路径。

method Dot overload 2 #
Dot(Single(), Single())

点积:SUM(v1(i) * v2(i)),累加结果为 Double。

method Min overload 2 #
Min(Double())

最小值。空数组会抛出 ArgumentException。

method Min #
Min(Double(), Int32, Int32)

求 [start, ends) 区间(前闭后开)的最小值。

method Max overload 2 #
Max(Double())

最大值。空数组会抛出 ArgumentException。

method Max #
Max(Double(), Int32, Int32)

求 [start, ends) 区间(前闭后开)的最大值。

method Max overload 3 #
Max(Single())

最大值。空数组会抛出 ArgumentException。

method Mean #
Mean(Double())

均值:SUM(v) / N。空数组会抛出 ArgumentException。

method Mean overload 2 #
Mean(Single())

均值:SUM(v) / N。空数组会抛出 ArgumentException。

method L1Norm overload 2 #
L1Norm(Double())

L1 范数:SUM(|v(i)|)。空数组返回 0。

method L1Norm #
L1Norm(Double(), Int32, Int32)

求 [start, ends) 区间(前闭后开)的 L1 范数。

method L2Norm #
L2Norm(Double())

L2 范数(欧几里得范数):SQRT(SUM(v(i) ^ 2))。空数组返回 0。

method ArgMax #
ArgMax(Double())

最大值所在的下标(第一个匹配项)。空数组会抛出 ArgumentException。

method ArgMin #
ArgMin(Double())

最小值所在的下标(第一个匹配项)。空数组会抛出 ArgumentException。