nuget server logo nuget api documents
↑

API Docs / Microsoft.VisualBasic.Runtime / SimdCompare

SimdCompare

Full name Microsoft.VisualBasic.Math.SIMD.SimdCompare Assembly Microsoft.VisualBasic.Runtime Members 20

逐元素比较、掩码与条件选择。

00 Remarks

Vector 的比较原语返回的是“掩码向量”而不是布尔数组, 这里统一把掩码逐通道转换回 Boolean,以便与其他 .NET 代码自然互操作。

01 Syntax

Microsoft.VisualBasic.Math.SIMD.SimdCompare

02 Methods

NameOverloadsSummary
GreaterThan 1 逐元素大于:out(i) = v1(i) > v2(i)
LessThan 1 逐元素小于:out(i) = v1(i) < v2(i)
GreaterThanOrEqual 1 逐元素大于等于。
LessThanOrEqual 1 逐元素小于等于。
Equal 1 逐元素相等比较。
NotEqual 1 逐元素不等比较。
GreaterThan 1 逐元素大于(与标量广播比较):out(i) = v(i) > scalar
LessThan 1 逐元素小于(与标量广播比较)。
GreaterThanOrEqual 1 逐元素大于等于(与标量广播比较)。
LessThanOrEqual 1 逐元素小于等于(与标量广播比较)。
Equal 1 逐元素相等(与标量广播比较)。
NotEqual 1 逐元素不等(与标量广播比较)。
CompareScalar 1 逐元素与标量广播比较的通用实现。
LaneTrue 1 判断掩码向量的某个通道是否为真。
Select 2 按掩码在两组数据之间做条件选择: out(i) = If(mask(i), trueValues(i), falseValues(i))
Where 1 取出掩码为真的元素(压缩)。
Any 1 掩码中是否存在任何为真的元素。
All 1 掩码是否全部为真(空掩码返回 True)。
CountTrue 1 统计掩码中为真的元素个数。

03 Members

method GreaterThan #
GreaterThan``1(``0(), ``0())

逐元素大于:out(i) = v1(i) > v2(i)

method LessThan #
LessThan``1(``0(), ``0())

逐元素小于:out(i) = v1(i) < v2(i)

method GreaterThanOrEqual #
GreaterThanOrEqual``1(``0(), ``0())

逐元素大于等于。

method LessThanOrEqual #
LessThanOrEqual``1(``0(), ``0())

逐元素小于等于。

method Equal #
Equal``1(``0(), ``0())

逐元素相等比较。

method NotEqual #
NotEqual``1(``0(), ``0())

逐元素不等比较。

method GreaterThan #
GreaterThan(Double(), Double)

逐元素大于(与标量广播比较):out(i) = v(i) > scalar

method LessThan #
LessThan(Double(), Double)

逐元素小于(与标量广播比较)。

method GreaterThanOrEqual #
GreaterThanOrEqual(Double(), Double)

逐元素大于等于(与标量广播比较)。

method LessThanOrEqual #
LessThanOrEqual(Double(), Double)

逐元素小于等于(与标量广播比较)。

method Equal #
Equal(Double(), Double)

逐元素相等(与标量广播比较)。

method NotEqual #
NotEqual(Double(), Double)

逐元素不等(与标量广播比较)。

method CompareScalar #
CompareScalar(Double(), Double, VectorBinaryOp(Of Double))

逐元素与标量广播比较的通用实现。

Remarks

标量用 New Vector(Of Double)(scalar) 一次广播到整个寄存器, 不需要为比较物化一个和输入等长的常量数组。

method LaneTrue #
LaneTrue``1(Vector(Of ``0), Int32)

判断掩码向量的某个通道是否为真。

Remarks

掩码通道的取值只有两种可能:全 1 或者全 0(这是 SIMD 比较原语的约定: 浮点类型下“全 1”位模式读出 NaN,整数类型下读出 -1)。 因此只需要检查该通道覆盖的第一个字节就能判定真假:全 1 时是 0xFF,全 0 时是 0x00,不存在歧义,而且每次判定只需要一次 通道提取。

为什么不能重解释成固定的整数向量:Vector(Of Integer) 的通道宽度是 32 位,而 Double 的通道是 64 位,两者并不是一一对应的关系 (一个 double 通道会跨越两个 32 位通道)。按字节定位则对所有元素宽度 (Int16/Int32/Int64/Single/Double) 都成立,因为任何 Vector(Of T) 都铺满整个向量寄存器, 总字节数恒等,所以这种按位重解释在长度上总是安全的。

method Select #
Select(Boolean(), Double(), Double())

按掩码在两组数据之间做条件选择: out(i) = If(mask(i), trueValues(i), falseValues(i))

method Select overload 2 #
Select(Boolean(), Single(), Single())

按掩码在两组数据之间做条件选择(Single)。

method Where #
Where(Boolean(), Double())

取出掩码为真的元素(压缩)。

Remarks

元素压缩在 AVX-512 之前没有高效的硬件指令,这里保持顺序标量实现。

method Any #
Any(Boolean())

掩码中是否存在任何为真的元素。

method All #
All(Boolean())

掩码是否全部为真(空掩码返回 True)。

method CountTrue #
CountTrue(Boolean())

统计掩码中为真的元素个数。