Module_ComputingContext_zh - vorcyc/Vorcyc.Mathematics GitHub Wiki
轻量级 CPU 执行策略,用于在单次调用或代码块级别选择标量、SIMD 或并行实现,而无需全局可变状态。已覆盖 FFT、统计、线性代数、曲线拟合、批深度学习、MFCC/音频前端与训练入口(见下文「已接入 API」)。
不含 GPU:
ComputingContext仅调度 CPU(标量 / SIMD / 多线程)。主包已放弃内置 CUDA/ILGPU,详见 GPU 策略说明。
命名空间:Vorcyc.Mathematics
| 类型 | 说明 |
|---|---|
ComputingContext |
不可变执行策略(Normal / Simd / Parallel / Auto) |
ComputingScope |
AsyncLocal 作用域;using (ComputingScope.Enter(ctx)) { ... }
|
CpuExecutionMode |
CPU 模式枚举 |
ComputingContextExecution |
并行阈值、worker 数辅助,以及带可选 CancellationToken 的索引 ForEach
|
显式 context 参数 > ComputingContext.Current(作用域) > Default
context: null 表示「不指定」,走上述解析链,不是强制标量。
ComputingContext.Normal // 标量
ComputingContext.Simd // SIMD
ComputingContext.Parallel // 并行(大数据)
ComputingContext.Auto // 按 problemSize 启发式
ComputingContext.Default // 进程级默认(初始为 Auto)Auto 阈值(元素/flop 数):≥1024 → SIMD,≥16384 → Parallel(见 ResolveCpuMode)。
signal.TransformToFrequencyDomain();
values.Sum();
var c = a * b;signal.TransformToFrequencyDomain(ComputingContext.Parallel, WindowType.Hamming);
FastFourierTransform.Forward(input, output, ComputingContext.Simd);
var sum = span.Sum(ComputingContext.Parallel);
var product = MatrixFp32.Multiply(a, b, ComputingContext.Parallel);using (ComputingScope.Enter(ComputingContext.Parallel))
{
var spec1 = s1.TransformToFrequencyDomain();
var spec2 = s2.TransformToFrequencyDomain(ComputingContext.Simd); // 单次覆盖
var mean = buffer.Average(); // 走 Parallel 作用域
}ComputingContext.ConfigureDefault(ComputingContext.Auto);-
ITimeDomainSignal.TransformToFrequencyDomain(ComputingContext?, WindowType?)— 经FastFourierTransform走 SoAFftButterflyFp32 -
FastFourierTransform.Forward / Inverse(..., ComputingContext?)(span / array / 指针 / 就地;WillAccelerate时走 SoA 蝶形) TimeDomainCharacteristicOps.GetRms / GetAmplitude / GetAveragePower / ...-
ISingleThreadTimeDomainSignal.GetRms(context)等扩展(绕过缓存属性) - 模态分解(
Vorcyc.Mathematics.SignalProcessing.Transforms.ModeDecomposition)— 详见 变换操作:-
EmpiricalModeDecomposition/EnsembleEmpiricalModeDecomposition(EEMD)/CompleteEnsembleEmd(CEEMDAN,Torres 2011) -
VariationalModeDecomposition/MultivariateVariationalModeDecomposition(MVMD) -
MultivariateEmpiricalModeDecomposition(MEMD) -
SingularSpectrumAnalysis(SSA)/EmpiricalWaveletTransform(EWT) -
HilbertHuangTransform(Analyze始终跑 EMD;已有模态用AnalyzeModes/ModeDecomposer.Instantaneous) - 均支持
CancellationToken+IProgress<ModeDecompositionProgress>;选项含ComputingContext?(为 null 时尊重ComputingScope) -
并行 / 集成: EEMD 与 CEEMDAN 集成成员走
ComputingContextExecution.ForEach;VMD / MVMD / EWT 的 FFT 路径始终传入已解析 context;SSA 将 context 转发到 SVD - 仍以串行为主: EMD / MEMD 样条与极值循环;CEEMDAN 噪声 EMD 预计算按 realization 并行
- 门面:
ModeDecomposer.Emd / Eemd / Ceemdan / Vmd / Hht / Instantaneous / Memd / Mvmd / Ssa / Ewt
-
- Z / 拉普拉斯(
Vorcyc.Mathematics.SignalProcessing.Transforms):-
ZTransform.Dtft/Transform/ 多 ωEvaluateFrequencyResponse—UseParallelIndexed→ForEach(worker 标量);否则显式/解析为 Simd → 频率维 SIMD;Normal → 标量。显式ComputingContext.Simd/Parallel/Normal不经 Auto 的 1K/16K 阶梯(ResolveCpuMode);是否开线程仍由共享并行工作量门闩(UseParallelIndexed,总工作量 ≥65 536)决定。 -
LaplaceTransform.FrequencyResponse— 对 ω 同样调度(jωlane 上 SIMD Horner) - 单点
Evaluate/IsStable/ 双线性映射 — O(阶数);无 context(有意)
-
-
Basic.Sum / Average / Variance / StandardDeviation(Span<float/double>与泛型浮点) -
Correlation.PearsonCorrelation(x, y, context)(泛型,大数据时并行归约) -
Standardization.ZScore(values, sample, context)(泛型,并行归约 + 并行写回) -
InformationTheory.Entropy / EntropyBits / KullbackLeiblerDivergence(..., context)(泛型;并行归约保持与标量一致的短路语义) IComparableExtension.CompareMax / CompareMin
-
MatrixFp32.Multiply(a, b, context)、Matrix<T>.Multiply(...) MatrixFp32.Multiply(vector, result, context)VectorSpan.Dot / Sum / Norm / Add / Subtract / Axpy / Scale(..., context)-
MatrixDecomposition.SingularValueDecomposition(matrix, tolerance, context, cancellationToken)— Householder 应用与因子合成尊重 context;双对角 QR 迭代仍串行(每轮轮询取消)
凡接受 ComputingContext? context 的 API,在 context == null 时也会调用 ComputingContext.Resolve(null),因此 ComputingScope 对显式传入 null 的调用同样生效(与文档中的解析顺序一致)。无 context 参数的旧重载不受影响。
-
TensorStatistics.MeanAlongAxis / StandardDeviationAlongAxis / NormalizeAlongAxis / MeanAlongDepth(可选context) -
Basic.WeightedAverage(values, weights, context)(泛型浮点)
-
ComputingContextExecution.ForEach— 批维度 / 索引并行调度 -
批层前向与反向均已并行(读取
ComputingScope/Resolve,自 0.9.2):-
BatchConv2DMath(原生卷积,kernel<5):前向按样本并行;反向拆为两个无竞争核——gradInput按样本并行、权重/偏置梯度按输出通道并行。 -
BatchConv2DIm2Col(im2col 卷积,kernel≥5):前向 GEMM 行并行;反向同样两核(gradCol按 patch、权重/偏置按输出通道)。 -
BatchFullyConnectedLayer:前向按样本并行;反向两核(gradInput按样本、权重/偏置按输出单元)。 -
BatchMaxPool2DMath/BatchAvgPool2DLayer/BatchGlobalAveragePool2DLayer:前向 + 反向按样本并行。 -
BatchUpsample2DLayer/BatchSoftmaxLayer/BatchConcatenateLayer:前向 + 反向按样本并行。 -
BatchTransposedConvolution2DLayer(转置卷积):前向按样本;反向两核(同卷积模式)。 -
BatchDepthwiseConvolution2DLayer:前向 + 反向按通道并行(每通道独占滤波器/偏置/梯度面,单核即无竞争)。 -
BatchLayerNormLayer:前向按空间位置并行;反向两核(gradInput按位置、scale/shift 按通道)。 -
BatchSqueezeExciteLayer(SE 注意力):前向 + 反向的逐通道缩放按样本并行(子层 FC/GAP 自带并行)。
-
-
Trainer.Fit / FitBatched / FitBatchSequential / FitBatchParallelConcat / FitCnnMlp可选computingContext参数 MlpTrainingOptions.ComputingContext- 遗留单样本层
Layers.Conv2D / Dense / LinearLayer / MaxPool2D / ReLU / Sigmoid / BatchNorm / JoinLayer / Fusion— 通道维ForEachDepth(尊重ComputingScope)
所有反向并行核均按「无共享写竞争」原则切分(梯度输入按样本/空间位置、权重梯度按输出通道/单元),其结果与串行实现逐位一致——见测试
ComputingContext_equivalence_test(涵盖各层前向/反向 parallel==serial 等价)。
-
TensorOps.GemmTransposeRight(..., ComputingContext?)— im2col 卷积 GEMM 行并行
-
FeatureExtractor.ParallelChunksComputeFrom/ParallelComputeFrom(..., ComputingContext?)— 线程数与分块并行 -
MfccExtractor等子类通过ParallelComputeFrom(samples, context: ComputingContext.Parallel)或外层ComputingScope统一策略
-
Trainer.FitCnnMlp(..., computingContext)— 与FitBatched相同的作用域安装 -
BatchPreEmphasisLayer/BatchStftMagnitudeLayer/BatchMelFilterbankLayer— 批维ForEach(STFT 并行使用每线程Stft实例) -
BatchNormLayer/BatchBatchNormLayer— 通道维并行(大数据时)
// MFCC 离线特征
using (ComputingScope.Enter(ComputingContext.Parallel))
var mfcc = extractor.ParallelComputeFrom(samples);
// CNN + Mel 前端训练
trainer.FitCnnMlp(model, loss, opt, batches, epochs, computingContext: ComputingContext.Parallel);Vorcyc.Mathematics.MachineLearning 中的大多数模型都接受可选的 ComputingContext? context 构造参数,并/或提供可写的 Context 属性。对实现 IBatchClassifier / IBatchRegressor 的模型,由实例的 Context 管控 PredictBatch;按行/按类/按树的循环经 ComputingContextExecution 调度。
- 批量预测(按行):
LogisticRegression、SoftmaxRegression、GaussianNaiveBayes、OneVsRestClassifier、NumericDecisionTree、NumericRandomForest、KnnClassifier、KnnRegressor、MultipleLinearRegression、MultivariateRidgeRegression、ClassificationPipeline、RegressionPipeline - 并行训练:
GradientBoostingClassifier(按类)、OneVsRestClassifier(按类)、NumericRandomForest(按树,确定性种子) - 聚类 / 降维 / 源分离:
KMeansClusterer、ExpectationMaximization/GMM、DBSCAN、HierarchicalClustering、VectorQuantization、PCA、LinearDiscriminantAnalysis、FactorAnalysis、TSNE、Decomposition.ICA - 辅助:
ClassificationMetrics.ConfusionMatrix(..., context)、ModelBatchExtensions.PredictBatch(..., context)(非批量分类器的泛型回退) - 曲线拟合:全部
CurveFitter<T>方法 — 见下文 曲线拟合
using Vorcyc.Mathematics.MachineLearning;
var forest = new NumericRandomForest<double>(numTrees: 80, seed: 11) { Context = ComputingContext.Parallel };
forest.Fit(xTrain, yTrain);
int[] preds = forest.PredictBatch(xTest);
// 或通过作用域一次性管控多个模型(保持 Context 未设置)
var knn = new KnnClassifier<double>(k: 3);
knn.Fit(xTrain, yTrain);
using (ComputingScope.Enter(ComputingContext.Parallel))
{
int[] p = knn.PredictBatch(xTest);
}每个并行核都只写入互不相交的索引并使用线程本地暂存,因此结果与串行路径逐位一致(见
TESTS/ML_module_test)。AdaBoostClassifier与SupportVectorMachine为保持一致暴露Context,但当前仍为串行执行。完整清单:机器学习模块。
CurveFitter<T> 各方法均接受可选参数 ComputingContext? computingContext = null,分发语义与 Statistics / VectorSpan 一致:
-
UseParallelIndexed达到共享阈值 → 并行(ComputingContextExecution.ForEach;工作项内保持标量) - 否则
Normal(或非float/double)→ 标量 - 否则 → SIMD(显式
Parallel但总工作量未达 65 536 时同样回退到 SIMD)
| 方法 | 说明 |
|---|---|
Linear / Polynomial / Exponential / Logarithmic / Power
|
既有 Fit_SIMD Vector 内核;暂无独立并行核 — Parallel 回退到 SIMD(与 Statistics 在未达并行阈值时回退 SIMD 同思路) |
Sinusoidal |
解析雅可比 LM;残差/雅可比装配可并行;Simd 模式下向量化归约 |
CubicSpline |
三对角求解仍串行;MSE / 预测装配遵循 context |
LocallyWeighted |
各查询点经 ForEach;Simd 模式下加权和向量化 |
MovingAverage |
各窗口经 ForEach;Simd 模式下窗口求和向量化 |
GaussianProcess |
核 / α / 预测 / 高斯–约当消元行经 ForEach + SIMD;可选 CancellationToken(0.10.9);结果含 PredictStd / PredictVariance(0.10.10) |
Nonlinear(一维 / 多列) |
LM 残差/雅可比经 ForEach;Simd 模式下 JᵀJ / Jᵀr 点积向量化 |
BayesianLinear |
设计矩阵装配经 ForEach
|
using Vorcyc.Mathematics;
using Vorcyc.Mathematics.MachineLearning.CurveFitting;
var fit = CurveFitter<double>.Sinusoidal(x, y, maxIterations: 200, ComputingContext.Simd);
using (ComputingScope.Enter(ComputingContext.Parallel))
{
var ma = CurveFitter<float>.MovingAverage(xs, ys, windowSize: 9); // null → 作用域
}null 经 ComputingContext.Resolve 解析(显式 → 作用域 → Default)。仅 float / double 走 SIMD。
FftVersion、FastFourierTransform.Version 与 TransformToFrequencyDomain(WindowType?, FftVersion) 已在 0.10.12 删除。请用 ComputingContext / ComputingScope:
| 已删除 API | 替代 |
|---|---|
FftVersion.SIMD |
ComputingContext.Simd |
FftVersion.Parallel |
ComputingContext.Parallel |
FftVersion.Normal |
ComputingContext.Normal |
TransformToFrequencyDomain(window, fftVersion) |
TransformToFrequencyDomain(context, window) |
FastFourierTransform.Version = ... |
ComputingScope.Enter(...) 或 per-call context
|
无显式 context 的指针 / 就地重载传入 null,仍尊重 ComputingScope,并走同一套 SoA FftButterflyFp32。
| 常量 | 值 | 用途 |
|---|---|---|
ParallelReductionThreshold |
65536 | Sum、方差、点积等归约 |
ParallelMatrixMultiplyThreshold |
262144 | 矩阵乘 |
ForEach(context, from, to, body, workPerItem, …, cancellationToken) 沿用同一套 UseParallelIndexed 门闩。并行时将 CancellationToken 挂到 ParallelOptions;串行时在每个下标前轮询。
-
Signal.Rms/Amplitude等缓存属性 — 固定 SIMD 路径;需策略感知时请用GetRms(context)等扩展 -
MatrixFp32 operator *、values.Sum()无参重载 — 走库默认行为;需要时用Multiply(..., context)/Sum(context)
- LU / QR 分解 — 无并行热点(薄 SVD 已接入 context;见上文线性代数)
- SVD 内双对角 QR 迭代 — 有意串行(轮询取消)
- 重叠相加滤波器 — 单线程实现
- GPU / CUDA — 主包不提供;见 GPU 策略说明
说明:无
context参数的旧 API 行为不变;仅文档列出的热点会读取ComputingContext/ComputingScope。
主包当前仅在 CPU 上执行。下列枚举描述未来扩展面,尚未接入 ComputingContext。
| 值 | 含义 |
|---|---|
CPU |
主机处理器(当前默认) |
GPU |
图形 / 计算 GPU |
FPGA |
现场可编程门阵列 |
ASIC |
专用集成电路 |
TPU |
张量处理单元 |
NPU |
神经网络处理单元 |
将后端选择与执行风格对应:Sequential_Normal、Sequential_SIMD、Parallel。
详见 GPU 策略说明。
Normal / Parallel(及 SIMD)路径的数值等价性由测试保障:
| 测试项目 | 内容 |
|---|---|
TESTS/core_module_test |
ComputingContext_test:统计、矩阵、VectorSpan、FFT roundtrip、大数组并行 |
TESTS/DL_module_test |
ComputingContext_equivalence_test:27 项前向/反向/训练/MFCC/前端层 Normal vs Parallel |
TESTS/ML_module_test |
ComputingContext_equivalence_test(估计器 / 聚类 / 降维)+ CurveFitting_Sinusoidal_test(正弦拟合正确性及 Normal / Simd / Parallel / Auto / ComputingScope 等价) |
TESTS/SP_module_test |
模态分解套件(EMD / VMD / HHT / CEEMDAN 重构 / 并行 CEEMDAN / SSA+Parallel 等) |
运行方式(Release):
dotnet run --project TESTS/core_module_test/core_module_test.csproj -c Release
dotnet run --project TESTS/DL_module_test/DL_module_test.csproj -c Release
dotnet run --project TESTS/ML_module_test/ML_module_test.csproj -c Release
dotnet run --project TESTS/SP_module_test/SP_module_test.csproj -c Release等价容差:前向/反向 1e-4;训练后推理 5e-3(浮点累加顺序差异)。曲线拟合各模式应在较小绝对/相对容差内一致(见 ML 测试脚手架)。