nuget server logo nuget api documents
↑

API Docs / Microsoft.VisualBasic.Runtime / SimdParallel

SimdParallel

Full name Microsoft.VisualBasic.Math.SIMD.SimdParallel Assembly Microsoft.VisualBasic.Runtime Members 19

“分块并行 + 块内向量化”的混合计算驱动。

00 Remarks

单个 Vector(Of T) 指令已经能吃满一个核心的浮点吞吐,因此当数据规模超过 缓存容量之后,进一步的收益只能来自多核并行。这里的策略是把数组切分成若干个 远大于缓存行的块(避免伪共享与线程调度开销),每个块内部继续使用 SimdEngine / SimdReduce 的向量化内核。

阈值:只有当长度达到 SimdParallel.MinParallelLength 的两倍以上时才会真正 启用并行;小数组会直接退化为单线程向量化路径,避免并行调度开销反而拖慢计算。

结果确定性:分块归约的浮点累加顺序与单线程实现不同,因此 SimdParallel.Sum() / SimdParallel.Dot() 等函数的结果与单线程版本可能存在 末位 ULP 级别的差异(这是浮点归约的固有性质,不是 bug)。

01 Syntax

Microsoft.VisualBasic.Math.SIMD.SimdParallel

02 Methods

NameOverloadsSummary
ShouldParallelize 1 当前数据长度是否值得启用并行。
ChunkSize 1 依据数据长度与处理器个数计算分块大小。
SumRange 1 对 [start, ends) 区间做 4 路累加器求和。
DotRange 1 对 [start, ends) 区间做 4 路累加器点积。
BinaryRange 1 对 [start, ends) 区间做逐元素二元运算并写入 out。
Sum 1 分块并行求和。空数组返回 0。
Dot 1 分块并行点积。空数组返回 0。
SumSquares 1 分块并行平方和。
L1Norm 1 分块并行 L1 范数。
L2Norm 1 分块并行 L2 范数。
Min 1 分块并行最小值。
Max 1 分块并行最大值。
Add 1 分块并行逐元素相加:out(i) = v1(i) + v2(i)
Subtract 1 分块并行逐元素相减:out(i) = v1(i) - v2(i)
Multiply 1 分块并行逐元素相乘:out(i) = v1(i) * v2(i)
MultiplyScalar 1 分块并行标量乘法:out(i) = scalar * v(i)
MatrixDot 1 计算两个矩阵的乘积,行方向并行、行内使用 SIMD 点积。

03 Properties

NameOverloadsSummary
Enable 1 并行计算的全局开关,默认启用。
MinParallelLength 1 触发并行的最小数据长度(单块的最小规模)。

04 Members

method ShouldParallelize #
ShouldParallelize(Int32)

当前数据长度是否值得启用并行。

method ChunkSize #
ChunkSize(Int32)

依据数据长度与处理器个数计算分块大小。

method SumRange #
SumRange(Double(), Int32, Int32)

对 [start, ends) 区间做 4 路累加器求和。

method DotRange #
DotRange(Double(), Double(), Int32, Int32)

对 [start, ends) 区间做 4 路累加器点积。

method BinaryRange #
BinaryRange``1(``0(), ``0(), ``0(), Int32, Int32, VectorBinaryOp(Of ``0))

对 [start, ends) 区间做逐元素二元运算并写入 out。

method Sum #
Sum(Double())

分块并行求和。空数组返回 0。

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

分块并行点积。空数组返回 0。

method SumSquares #
SumSquares(Double())

分块并行平方和。

method L1Norm #
L1Norm(Double())

分块并行 L1 范数。

method L2Norm #
L2Norm(Double())

分块并行 L2 范数。

method Min #
Min(Double())

分块并行最小值。

method Max #
Max(Double())

分块并行最大值。

method Add #
Add(Double(), Double())

分块并行逐元素相加:out(i) = v1(i) + v2(i)

method Subtract #
Subtract(Double(), Double())

分块并行逐元素相减:out(i) = v1(i) - v2(i)

method Multiply #
Multiply(Double(), Double())

分块并行逐元素相乘:out(i) = v1(i) * v2(i)

method MultiplyScalar #
MultiplyScalar(Double, Double())

分块并行标量乘法:out(i) = scalar * v(i)

method MatrixDot #
MatrixDot(Double()(), Double()())

计算两个矩阵的乘积,行方向并行、行内使用 SIMD 点积。

Parameters
NameTypeDescription
aDouble()()

左矩阵,形状 nrowA x n

bDouble()()

右矩阵,形状 n x ncolB

property Enable #
Enable

并行计算的全局开关,默认启用。

property MinParallelLength #
MinParallelLength

触发并行的最小数据长度(单块的最小规模)。