“分块并行 + 块内向量化”的混合计算驱动。
SimdParallel
00 Remarks
单个 Vector(Of T) 指令已经能吃满一个核心的浮点吞吐,因此当数据规模超过 缓存容量之后,进一步的收益只能来自多核并行。这里的策略是把数组切分成若干个 远大于缓存行的块(避免伪共享与线程调度开销),每个块内部继续使用 SimdEngine / SimdReduce 的向量化内核。
阈值:只有当长度达到 SimdParallel.MinParallelLength 的两倍以上时才会真正 启用并行;小数组会直接退化为单线程向量化路径,避免并行调度开销反而拖慢计算。
结果确定性:分块归约的浮点累加顺序与单线程实现不同,因此 SimdParallel.Sum() / SimdParallel.Dot() 等函数的结果与单线程版本可能存在 末位 ULP 级别的差异(这是浮点归约的固有性质,不是 bug)。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| 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
| Name | Overloads | Summary |
|---|---|---|
| Enable | 1 | 并行计算的全局开关,默认启用。 |
| MinParallelLength | 1 | 触发并行的最小数据长度(单块的最小规模)。 |
04 Members
Int32)当前数据长度是否值得启用并行。
Int32)依据数据长度与处理器个数计算分块大小。
Double(), Int32, Int32)对 [start, ends) 区间做 4 路累加器求和。
Double(), Double(), Int32, Int32)对 [start, ends) 区间做 4 路累加器点积。
对 [start, ends) 区间做逐元素二元运算并写入 out。
Double())分块并行求和。空数组返回 0。
Double(), Double())分块并行点积。空数组返回 0。
Double())分块并行平方和。
Double())分块并行 L1 范数。
Double())分块并行 L2 范数。
Double())分块并行最小值。
Double())分块并行最大值。
Double(), Double())分块并行逐元素相加:out(i) = v1(i) + v2(i)
Double(), Double())分块并行逐元素相减:out(i) = v1(i) - v2(i)
Double(), Double())分块并行逐元素相乘:out(i) = v1(i) * v2(i)
Double, Double())分块并行标量乘法:out(i) = scalar * v(i)
Double()(), Double()())计算两个矩阵的乘积,行方向并行、行内使用 SIMD 点积。
| Name | Type | Description |
|---|---|---|
a | Double()() | 左矩阵,形状 |
b | Double()() | 右矩阵,形状 |
并行计算的全局开关,默认启用。
触发并行的最小数据长度(单块的最小规模)。