向量化运算的统一词汇表: 脚本向量化改写器所发射的全部调用都指向本模块。
Vectorized
00 Remarks
为什么需要独立的一套词汇: SimdExtensions 已被大量既有代码以 Imports Microsoft.VisualBasic.Math.SIMD 的方式直接引用, 其成员名 (SimdAdd / SimdAbs / SimdSum …) 都被占用。 而 VB 对「两个已导入模块之中的同名成员」会直接报 BC30562(名称不明确) —— 即使签名不同、即使调用处写了显式泛型实参也无法化解。 因此本模块统一采用 Vec* 前缀, 与 SimdExtensions 完全不存在重名。
为什么放在 Math.SIMD.Vectorization 子命名空间: 生成代码只需要 Imports Microsoft.VisualBasic.Math.SIMD.Vectorization 一条导入语句, 这样既能看到本模块的 Vec* 成员, 又不会把 Microsoft.VisualBasic.Math.SIMD 之中那些泛化命名的历史门面类(Add / Subtract / Multiply / Divide / Modulo / Exponent)带进脚本作用域, 从而不会与脚本自身定义的类型产生歧义。
实现策略:
- 有真 SIMD 内核可用的一律转调 / /
(基于 );
- 框架/硬件没有对应内核的运算(整除 \、取余 Mod、乘积归约、逐元素映射)
退化为标量循环, 与运行时既有 Modulo / Exponent 门面处于同一实现水平;
- 归约刻意走 的顺序内核而不是 SimdParallel 的分块并行,
以保证脚本的浮点结果可复现(并行归约的加法次序不确定)。
长度契约: 向量⊕向量运算假设两侧长度一致, 与 SimdEngine 保持一致, 不额外做长度校验(长度不足时由运行时自身的边界检查抛出)。
词汇完整性: 本模块按「数值类型 × 运算形态」把词汇一次性补全, 因此其中 VecSquare 与 VecReciprocal 目前没有对应的改写来源 (脚本里的 v * v / 1 / v 分别被发射为 VecMultiply / VecScalarDivide, 以保持 VB 的逐元素类型语义), 它们作为词汇表的一部分保留, 供脚本直接调用。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| ZipMap | 1 | 逐元素二元运算的标量循环实现(VB 不支持泛型运算符约束, 因此运算由调用方注入) |
| ZipScalarMap | 1 | 向量 ⊕ 标量 的标量循环实现 |
| ScalarZipMap | 1 | 标量 ⊕ 向量 的标量循环实现(标量位于左操作数一侧) |
| VecAdd | 1 | 逐元素相加: out(i) = v1(i) + v2(i) |
| VecSubtract | 1 | 逐元素相减: out(i) = v1(i) - v2(i) |
| VecMultiply | 1 | 逐元素相乘: out(i) = v1(i) * v2(i) |
| VecDivide | 2 | 逐元素真除法(VB 的 /): out(i) = v1(i) / v2(i) |
| VecIntegerDivide | 2 | 逐元素整除(VB 的 \, Int32) |
| VecModulo | 4 | 逐元素取余(VB 的 Mod, Double) |
| VecPower | 1 | 逐元素幂(VB 的 ^): out(i) = v1(i) ^ v2(i) |
| VecAddScalar | 1 | 向量加标量: out(i) = v(i) + scalar |
| VecSubtractScalar | 1 | 向量减标量: out(i) = v(i) - scalar |
| VecScalarSubtract | 1 | 标量减向量: out(i) = scalar - v(i) |
| VecMultiplyScalar | 1 | 向量乘标量: out(i) = v(i) * scalar |
| VecDivideScalar | 2 | 向量除以标量: out(i) = v(i) / scalar |
| VecScalarDivide | 2 | 标量除以向量: out(i) = scalar / v(i) |
| VecIntegerDivideScalar | 2 | 向量整除标量(VB 的 \, Int32) |
| VecScalarIntegerDivide | 2 | 标量整除向量(VB 的 \, Int32) |
| VecModuloScalar | 4 | 向量对标量取余(VB 的 Mod, Double) |
| VecScalarModulo | 4 | 标量对向量取余(VB 的 Mod, Double) |
| VecPowerScalar | 1 | 向量的标量次幂(VB 的 v ^ n) |
| VecScalarPower | 1 | 标量的向量次幂(VB 的 b ^ v) |
| VecNegate | 1 | 逐元素取负: out(i) = -v(i) |
| VecAbs | 1 | 逐元素绝对值: out(i) = |v(i) |
| VecSquare | 1 | 逐元素平方: out(i) = v(i) * v(i) |
| VecSqrt | 2 | 逐元素平方根 |
| VecExp | 2 | 逐元素自然指数 |
| VecLog | 3 | 逐元素任意底对数 |
| VecSign | 2 | 逐元素符号函数 |
| VecFloor | 2 | 逐元素向下取整 |
| VecCeiling | 2 | 逐元素向上取整 |
| VecTruncate | 2 | 逐元素截断取整 |
| VecReciprocal | 2 | 逐元素倒数: out(i) = 1 / v(i) |
| VecMap | 1 | 任意一元函数的逐元素映射: out(i) = f(v(i)) |
| VecConvert | 1 | 逐元素元素类型转换。 |
| VecSum | 5 | 向量求和 SUM(v)(Double) |
| VecMean | 4 | 向量均值(Double) |
| VecMin | 5 | 向量最小值 |
| VecMax | 5 | 向量最大值 |
| VecProduct | 5 | 向量乘积 PRODUCT(v); 空向量返回乘法单位元 1 |
| VecCount | 1 | 向量元素个数 COUNT(v) |
| VecAdd | 1 | |
| VecSubtract | 1 | |
| VecMultiply | 1 | |
| VecAddScalar | 1 | |
| VecSubtractScalar | 1 | |
| VecScalarSubtract | 1 | |
| VecMultiplyScalar | 1 | |
| VecNegate | 1 | |
| VecAbs | 1 | |
| VecSquare | 1 | |
| VecMap | 1 | |
| VecConvert | 1 | |
| VecCount | 1 |
03 Members
``0(), ``0(), Func(Of ``0, ``0, ``0))逐元素二元运算的标量循环实现(VB 不支持泛型运算符约束, 因此运算由调用方注入)
``0(), ``0, Func(Of ``0, ``0, ``0))向量 ⊕ 标量 的标量循环实现
``0, ``0(), Func(Of ``0, ``0, ``0))标量 ⊕ 向量 的标量循环实现(标量位于左操作数一侧)
``0(), ``0())逐元素相加: out(i) = v1(i) + v2(i)
``0(), ``0())逐元素相减: out(i) = v1(i) - v2(i)
``0(), ``0())逐元素相乘: out(i) = v1(i) * v2(i)
Double(), Double())逐元素真除法(VB 的 /): out(i) = v1(i) / v2(i)
只提供 Double/Single 形态 —— VB 的 / 对整型操作数会先把结果提升为 Double, 改写器在调用之前已经完成提升。
Single(), Single())逐元素真除法(VB 的 /, Single)
Int32(), Int32())逐元素整除(VB 的 \, Int32)
Int64(), Int64())逐元素整除(VB 的 \, Int64)
Int32(), Int32())逐元素取余(VB 的 Mod, Int32)
Int64(), Int64())逐元素取余(VB 的 Mod, Int64)
Single(), Single())逐元素取余(VB 的 Mod, Single)
Double(), Double())逐元素取余(VB 的 Mod, Double)
Double(), Double())逐元素幂(VB 的 ^): out(i) = v1(i) ^ v2(i)
VB 的 ^ 无论操作数为何种数值类型, 结果恒为 Double。
``0(), ``0)向量加标量: out(i) = v(i) + scalar
``0(), ``0)向量减标量: out(i) = v(i) - scalar
``0, ``0())标量减向量: out(i) = scalar - v(i)
``0(), ``0)向量乘标量: out(i) = v(i) * scalar
Double(), Double)向量除以标量: out(i) = v(i) / scalar
Single(), Single)向量除以标量(Single)
Double, Double())标量除以向量: out(i) = scalar / v(i)
Single, Single())标量除以向量(Single)
Int32(), Int32)向量整除标量(VB 的 \, Int32)
Int64(), Int64)向量整除标量(VB 的 \, Int64)
Int32, Int32())标量整除向量(VB 的 \, Int32)
Int64, Int64())标量整除向量(VB 的 \, Int64)
Int32(), Int32)向量对标量取余(VB 的 Mod, Int32)
Int64(), Int64)向量对标量取余(VB 的 Mod, Int64)
Single(), Single)向量对标量取余(VB 的 Mod, Single)
Double(), Double)向量对标量取余(VB 的 Mod, Double)
Int32, Int32())标量对向量取余(VB 的 Mod, Int32)
Int64, Int64())标量对向量取余(VB 的 Mod, Int64)
Single, Single())标量对向量取余(VB 的 Mod, Single)
Double, Double())标量对向量取余(VB 的 Mod, Double)
Double(), Double)向量的标量次幂(VB 的 v ^ n)
Double, Double())标量的向量次幂(VB 的 b ^ v)
``0())逐元素取负: out(i) = -v(i)
``0())逐元素绝对值: out(i) = |v(i)|
``0())逐元素平方: out(i) = v(i) * v(i)
Double())逐元素平方根
Single())逐元素平方根(Single)
Double())逐元素自然指数
Single())逐元素自然指数(Single)
Double())逐元素自然对数
Single())逐元素自然对数(Single)
Double(), Double)逐元素任意底对数
Double())逐元素符号函数
Single())逐元素符号函数(Single)
Double())逐元素向下取整
Single())逐元素向下取整(Single)
Double())逐元素向上取整
Single())逐元素向上取整(Single)
Double())逐元素截断取整
Single())逐元素截断取整(Single)
Double())逐元素倒数: out(i) = 1 / v(i)
Single())逐元素倒数(Single)
``0(), Func(Of ``0, ``1))任意一元函数的逐元素映射: out(i) = f(v(i))
「逐元素数学函数」的通用兜底入口: 运行时没有专用内核的函数(三角函数、四舍五入、 以及脚本自定义的数值函数)都通过本方法向量化。实现为标量循环 —— 委托调用本身无法被 SIMD 内核吸收。
``0())逐元素元素类型转换。
VB 对数组不存在逐元素转换(Short() 无法赋给 Integer() 形参), 因此当向量化运算两侧的元素类型不一致、或结果类型需要提升时, 改写器必须显式插入一次转换, 本方法即该用途。实现为标量循环, 每次只多一次遍历。
Double())向量求和 SUM(v)(Double)
Single())向量求和 SUM(v)(Single)
Int32())向量求和 SUM(v)(Int32)
Int64())向量求和 SUM(v)(Int64)
Int16())向量求和 SUM(v)(Int16)
LINQ 的数值归约把 Byte/Int16 一律拓宽到 Int32, 没有 Short 重载, 因此这里手写累加以保持「按元素类型累加」的语义。
Double())向量均值(Double)
Single())向量均值(Single)
Int32())向量均值(Int32, 结果恒为 Double)
Int64())向量均值(Int64, 结果恒为 Double)
Double())向量最小值
Single())向量最小值(Single)
Int32())向量最小值(Int32)
Int64())向量最小值(Int64)
Int16())向量最小值(Int16)
Double())向量最大值
Single())向量最大值(Single)
Int32())向量最大值(Int32)
Int64())向量最大值(Int64)
Int16())向量最大值(Int16)
Double())向量乘积 PRODUCT(v); 空向量返回乘法单位元 1
Single())向量乘积 PRODUCT(v)(Single)
Int32())向量乘积 PRODUCT(v)(Int32)
Int64())向量乘积 PRODUCT(v)(Int64)
Int16())向量乘积 PRODUCT(v)(Int16)
``0())向量元素个数 COUNT(v)
数组的 Length 访问是 O(1), 与 Enumerable.Count 的数组快速路径一致。
T(), T())T(), T())T(), T())T(), T)T(), T)T, T())T(), T)T())T())T())TIn(), Func(Of TIn, TOut))TIn())T())