Module_ComputingContext_zh - vorcyc/Vorcyc.Mathematics GitHub Wiki

当前位置 : 首页/计算上下文模块

计算上下文模块 - ComputingContext

轻量级 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)。


使用方式

1. 默认(不传参)

signal.TransformToFrequencyDomain();
values.Sum();
var c = a * b;

2. 单次显式指定

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);

3. 作用域(管道内多次调用)

using (ComputingScope.Enter(ComputingContext.Parallel))
{
    var spec1 = s1.TransformToFrequencyDomain();
    var spec2 = s2.TransformToFrequencyDomain(ComputingContext.Simd); // 单次覆盖
    var mean = buffer.Average(); // 走 Parallel 作用域
}

4. 配置进程默认

ComputingContext.ConfigureDefault(ComputingContext.Auto);

已接入 API

信号处理

  • ITimeDomainSignal.TransformToFrequencyDomain(ComputingContext?, WindowType?) — 经 FastFourierTransform 走 SoA FftButterflyFp32
  • 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 迭代仍串行(每轮轮询取消)

作用域解析(Phase 2 修正)

凡接受 ComputingContext? context 的 API,在 context == null 时也会调用 ComputingContext.Resolve(null),因此 ComputingScope 对显式传入 null 的调用同样生效(与文档中的解析顺序一致)。无 context 参数的旧重载不受影响。

张量统计

  • TensorStatistics.MeanAlongAxis / StandardDeviationAlongAxis / NormalizeAlongAxis / MeanAlongDepth(可选 context)
  • Basic.WeightedAverage(values, weights, context)(泛型浮点)

深度学习(Phase 3–4)

  • 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 等价)。

张量 GEMM(Phase 4)

  • TensorOps.GemmTransposeRight(..., ComputingContext?) — im2col 卷积 GEMM 行并行

特征提取 / MFCC 流水线(Phase 4+)

  • FeatureExtractor.ParallelChunksComputeFrom / ParallelComputeFrom(..., ComputingContext?) — 线程数与分块并行
  • MfccExtractor 等子类通过 ParallelComputeFrom(samples, context: ComputingContext.Parallel) 或外层 ComputingScope 统一策略

CNN + 音频前端(Phase 4+)

  • 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);

机器学习(Phase 5)

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,但当前仍为串行执行。完整清单:机器学习模块。

曲线拟合(Vorcyc.Mathematics.MachineLearning.CurveFitting)

CurveFitter<T> 各方法均接受可选参数 ComputingContext? computingContext = null,分发语义与 Statistics / VectorSpan 一致:

  1. UseParallelIndexed 达到共享阈值 → 并行(ComputingContextExecution.ForEach;工作项内保持标量)
  2. 否则 Normal(或非 float/double)→ 标量
  3. 否则 → 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

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。


并行阈值(ComputingContextExecution)

常量 值 用途
ParallelReductionThreshold 65536 Sum、方差、点积等归约
ParallelMatrixMultiplyThreshold 262144 矩阵乘

ForEach(context, from, to, body, workPerItem, …, cancellationToken) 沿用同一套 UseParallelIndexed 门闩。并行时将 CancellationToken 挂到 ParallelOptions;串行时在每个下标前轮询。


不读 ComputingContext 的 API(有意保留)

  • 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。

ComputingBackend

值 含义
CPU 主机处理器(当前默认)
GPU 图形 / 计算 GPU
FPGA 现场可编程门阵列
ASIC 专用集成电路
TPU 张量处理单元
NPU 神经网络处理单元

ComputingMethodPriority

将后端选择与执行风格对应: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 测试脚手架)。

⚠️ **GitHub.com Fallback** ⚠️