如何解决为什么将参数反转为 CMPGT 比较函数可以作为 CMPLT 工作?
我正在使用 AVX2 为一个项目优化一个小型数学库,但是,我偶然发现了一些轻微的不一致。
AVX2 缺乏对打包 32b i 的 CMPLT 功能的支持,这是不幸的。显然,创建此类操作的另一种方法是在 _mm256_cmpgt_epi32
函数中使用称为“属性转置”的做法。
参考:
_mm256_cmpgt_epi32(a,b)
预计 a > b
的计算将是所需的输入,但是,为了实现我们不存在的 _mm256_cmplt_epi32()
函数,我们需要像这样写出原始输入的逆:{{ 1}}。
我的问题是:为什么反转输入会将函数的操作更改为应该已经提供的操作(即 _mm256_cmpgt_epi32(b,a)
)?
解决方法
a<b
(a
小于 b
)在数学上与 b>a
相同(b
大于 a
)。符号向哪一侧打开的视觉指示无论是左还是右都具有相同的含义,但 <
是小于运算符,而 >
是大于运算符。
即要反转比较的操作数,请镜像运算符。如果这不是很明显,请尝试一些小整数情况,例如 1 > 2
与 2 < 1
,并且操作数相等,以查看它适用于两个整数之间所有 3 种可能的关系情况(大于、等于或小于)。
整数比较没有任何会使数学恒等式不起作用的 2 的补码环绕角情况。将此与 FP cmppd xmm,xmm/mem,imm8
进行对比,因为浮点数有第四种可能性(无序)1。
Intrinsics 已经可以提供 lt
和 gt
整数比较(但不是 ge
或 le
)在 {{1 }} 硬件说明。
不这样做的一个原因是提醒只有右手操作数才能将负载折叠到内存源中。并且(没有 AVX)如果在比较之后还需要左侧,则需要复制左侧。或者只是在列表中使用更少的内在函数,或者更少的没有完全对应的 asm 指令。
这些是提供更多比较asm指令可能有意义的原因,但无论出于何种原因,x86 直到 AVX2 之后才出现。 AVX-512 最终确实提供了比较指令,将谓词作为立即数而不是操作码的一部分(如 pcmpgt
),从而提供谓词的选择。 (cmpps
和 vpcmpub/w/d/q
也最终提供了无符号整数比较。)
仅提供一两个谓词并不是 x86 独有的:例如,MIPS 仅为无分支标量整数比较寄存器提供 vpcmpb/w/d/q
/ slt
。这意味着如果需要 sltu
来反转 xori reg,reg,1
结果,或者如果条件是 slt
或==
(How to do less than or equal in Assembly Language(MIPS)?)。
在 MIPS 上,branching 始终至多是一个 !=
(或 slt
)和一个 sltu
或 bnez
想要 slt 给你零还是一。 (Greater than,less than equal,greater than equal in MIPS)。与 RISC-V 不同,MIPS 在设计上没有两个寄存器 beqz
,so the branch condition could be ready in the first half-cycle of the EX stage on early MIPS hardware。
无论如何,当 x86 最初选择仅提供 blt
和有符号 eq
整数比较时,MIPS 的 RISC 设计可能影响了 MMX 的设计者。当时晶体管的预算要小得多(Pentium-MMX 于 90 年代中期发布)。 Intel 认为大多数热循环不会因为提供 gt
或无符号而加速很多,我猜,所以他们直到 AVX-512 才开始添加更灵活的整数比较。
脚注 1:
将此与 FP 比较进行对比,如果任一输入为 NaN,则两个值之间有 4 种可能的关系,更大、相等、更少或无序。
这是 SSE 确实设计 <=
/cmpps
将谓词作为直接的,允许更广泛的选择的部分原因。但在 AVX 之前,即使是 FP 比较也仅限于前 7 个谓词,cmppd
、==
、<
、无序、<=
、!=
、{{1 }},和“有序”。 The manual 对输入之间的 4 种可能关系中的每一种都有每个谓词的结果真值表,并表示
处理器未实现的大于关系需要在软件中模拟多于一条指令,因此不应作为伪操作实现。 (对于这些,程序员应该反转相应小于关系的操作数并使用移动指令来确保掩码移动到正确的目标寄存器并且源操作数保持不变。)
即使对于 FP,!<
与 !<=
的条件完全相同。
当晶体管预算较大时,SSE 的设计晚于 MMX,并且由 P6 而非 P5 解码。 (对于非标量版本,在第一代 SSE 实现中分为 2 个 uops)。可能也不需要 1 个周期的延迟为比较然后应用谓词腾出空间。通过在立即谓词上花费额外的代码大小字节,一些/所有这些原因可能是使 FP 比较更加灵活的选择的一部分。或许还有一些案例,其中 MMX only 具有 a > b
和 b < a
比较在实践中不方便。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。