单精度张量计算后端契约。
ITensorComputeF
00 Remarks
形状校验、广播等"语义边界"仍然由 TensorF 层负责, 后端只需要实现纯粹的数值计算。后端应当是无状态(或线程安全)的, 因为 TensorF.computeKernelF 是一个全局共享变量。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| Add | 1 | 逐元素相加 |
| Subtract | 1 | 逐元素相减 |
| Multiply | 1 | 逐元素相乘 |
| Divide | 1 | 逐元素相除 |
| Maximum | 1 | 逐元素取较大值 |
| Minimum | 1 | 逐元素取较小值 |
| Exp | 1 | 逐元素指数 |
| Log | 1 | 逐元素自然对数 |
| Sqrt | 1 | 逐元素平方根 |
| Square | 1 | 逐元素平方 |
| Abs | 1 | 逐元素绝对值 |
| Negate | 1 | 逐元素取负 |
| Reciprocal | 1 | 逐元素倒数 |
| Tanh | 1 | 逐元素双曲正切 |
| Sigmoid | 1 | 逐元素 Sigmoid |
| Relu | 1 | 逐元素 ReLU |
| AddScalar | 1 | 逐元素加标量 |
| MultiplyScalar | 1 | 逐元素乘标量 |
| DivideScalar | 1 | 逐元素除标量 |
| Clip | 1 | 把元素钳制到 [low, high] 区间 |
| MatMul | 1 | 二维矩阵乘法 |
| SumAll | 1 | 整体求和。累加使用双精度,避免大数组单精度累加的舍入误差。 |
| MeanAll | 1 | 整体求均值 |
| MinAll | 1 | 最小值 |
| MaxAll | 1 | 最大值 |
| Laplacian7 | 1 | 七点拉普拉斯 stencil:out = Σ(流体邻居) - nFluid * 中心。 固体(掩膜为 0)单元的输出恒为 0;固体邻居按 Neumann 零梯度不计入, 因此除数取该格的流体邻居数 nFluid。 |
| JacobiStencil7 | 1 | 带掩膜的七点 Jacobi 迭代。统一迭代式: x_new(idx) = (alpha · Σ_fluid x_old(邻居) + rhs(idx)) / denom 其中 denom = beta(当 beta > 0),否则 denom = nFluid(idx)。 固体单元恒为 0。两种典型用法: 压力泊松 ∇²p = div… |
| AdvectTrilinear | 1 | 半拉格朗日平流:对每个格子沿速度场反向追踪 dt 时间, 在回溯位置对源场做三线性插值采样。 这是纯 gather(只读源场、只写目标格),无 scatter,因此可以完全并行。 |
| ApplyMask | 1 | 按掩膜把所有给定场中的固体单元置零(无滑移壁:速度 / 压力 / 密度恒为 0)。 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| Name | 1 | 后端名称,用于诊断输出(例如 "SIMD-F32" / "CUDA-F32")。 |
04 Members
逐元素相加
逐元素相减
逐元素相乘
逐元素相除
逐元素取较大值
逐元素取较小值
逐元素指数
逐元素自然对数
逐元素平方根
逐元素平方
逐元素绝对值
逐元素取负
逐元素倒数
逐元素双曲正切
逐元素 Sigmoid
逐元素 ReLU
Single)逐元素加标量
Single)逐元素乘标量
Single)逐元素除标量
把元素钳制到 [low, high] 区间
二维矩阵乘法
整体求和。累加使用双精度,避免大数组单精度累加的舍入误差。
整体求均值
最小值
最大值
七点拉普拉斯 stencil:out = Σ(流体邻居) - nFluid 中心。 固体(掩膜为 0)单元的输出恒为 0;固体邻居按 Neumann 零梯度不计入, 因此除数取该格的流体邻居数 nFluid*。
| Name | Type | Description |
|---|---|---|
src | TensorF | 输入场 |
mask | Byte() | 固体掩膜,0 = 固体 / 空腔,非 0 = 流体。传 Nothing 表示全流体 |
nFluid | Byte() | 每格的流体邻居数(0..6),长度与场一致 |
拉普拉斯结果
带掩膜的七点 Jacobi 迭代。统一迭代式: x_new(idx) = (alpha · Σ_fluid x_old(邻居) + rhs(idx)) / denom 其中 denom = beta(当 beta > 0),否则 denom = nFluid(idx)。 固体单元恒为 0。两种典型用法: 压力泊松 ∇²p = div → alpha = 1, beta = 0(除数取 nFluid), rhs = -div 隐式扩散 (1+6a)φ = φ_old + a·Σ → alpha = a, beta = 1 + 6a, rhs = φ_old
| Name | Type | Description |
|---|---|---|
rhs | TensorF | 右端项(见上:压力泊松传 -div,扩散传 φ_old) |
mask | Byte() | 固体掩膜,0 = 固体。传 Nothing 表示全流体 |
nFluid | Byte() | 每格的流体邻居数 |
alpha | Single | 邻居项系数 |
beta | Single | 中心项除数;<= 0 表示除数改用每格流体邻居数 |
iterations | Int32 | 迭代次数 |
initial | TensorF | 初始猜测;传 Nothing 则全零开始 |
迭代后的解
半拉格朗日平流:对每个格子沿速度场反向追踪 dt 时间, 在回溯位置对源场做三线性插值采样。 这是纯 gather(只读源场、只写目标格),无 scatter,因此可以完全并行。
| Name | Type | Description |
|---|---|---|
src | TensorF | 被平流的源场 |
u | TensorF | 速度场 X 分量 |
v | TensorF | 速度场 Y 分量 |
w | TensorF | 速度场 Z 分量 |
dt | Single | 时间步长 |
mask | Byte() | 固体掩膜,0 = 固体(输出恒为 0)。传 Nothing 表示全流体 |
平流后的新场
Byte(), TensorF())按掩膜把所有给定场中的固体单元置零(无滑移壁:速度 / 压力 / 密度恒为 0)。
| Name | Type | Description |
|---|---|---|
mask | Byte() | 固体掩膜,0 = 固体 |
fields | TensorF() | 需要置零的场(数量不定) |
后端名称,用于诊断输出(例如 "SIMD-F32" / "CUDA-F32")。