逐元素比较、掩码与条件选择。
SimdCompare
00 Remarks
Vector 的比较原语返回的是“掩码向量”而不是布尔数组, 这里统一把掩码逐通道转换回 Boolean,以便与其他 .NET 代码自然互操作。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| GreaterThan | 1 | 逐元素大于:out(i) = v1(i) > v2(i) |
| LessThan | 1 | 逐元素小于:out(i) = v1(i) < v2(i) |
| GreaterThanOrEqual | 1 | 逐元素大于等于。 |
| LessThanOrEqual | 1 | 逐元素小于等于。 |
| Equal | 1 | 逐元素相等比较。 |
| NotEqual | 1 | 逐元素不等比较。 |
| LaneTrue | 1 | 判断掩码向量的某个通道是否为真。 |
| Select | 2 | 按掩码在两组数据之间做条件选择: out(i) = If(mask(i), trueValues(i), falseValues(i)) |
| Where | 1 | 取出掩码为真的元素(压缩)。 |
| Any | 1 | 掩码中是否存在任何为真的元素。 |
| All | 1 | 掩码是否全部为真(空掩码返回 True)。 |
| CountTrue | 1 | 统计掩码中为真的元素个数。 |
| GreaterThan | 1 | |
| LessThan | 1 | |
| GreaterThanOrEqual | 1 | |
| LessThanOrEqual | 1 | |
| Equal | 1 | |
| NotEqual | 1 |
03 Members
``0(), ``0())逐元素大于:out(i) = v1(i) > v2(i)
``0(), ``0())逐元素小于:out(i) = v1(i) < v2(i)
``0(), ``0())逐元素大于等于。
``0(), ``0())逐元素小于等于。
``0(), ``0())逐元素相等比较。
``0(), ``0())逐元素不等比较。
Int32)判断掩码向量的某个通道是否为真。
掩码通道的取值只有两种可能:全 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) 都铺满整个向量寄存器, 总字节数恒等,所以这种按位重解释在长度上总是安全的。
Boolean(), Double(), Double())按掩码在两组数据之间做条件选择: out(i) = If(mask(i), trueValues(i), falseValues(i))
Boolean(), Single(), Single())按掩码在两组数据之间做条件选择(Single)。
Boolean(), Double())取出掩码为真的元素(压缩)。
元素压缩在 AVX-512 之前没有高效的硬件指令,这里保持顺序标量实现。
Boolean())掩码中是否存在任何为真的元素。
Boolean())掩码是否全部为真(空掩码返回 True)。
Boolean())统计掩码中为真的元素个数。
T(), T())T(), T())T(), T())T(), T())T(), T())T(), T())