为什么将参数反转为 CMPGT 比较函数可以作为 CMPLT 工作?

如何解决为什么将参数反转为 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<ba 小于 b)在数学上与 b>a 相同(b 大于 a)。符号向哪一侧打开的视觉指示无论是左还是右都具有相同的含义,但 < 是小于运算符,而 > 是大于运算符。

要反转比较的操作数,请镜像运算符。如果这不是很明显,请尝试一些小整数情况,例如 1 > 22 < 1,并且操作数相等,以查看它适用于两个整数之间所有 3 种可能的关系情况(大于、等于或小于)。

整数比较没有任何会使数学恒等式不起作用的 2 的补码环绕角情况。将此与 FP cmppd xmm,xmm/mem,imm8 进行对比,因为浮点数有第四种可能性(无序)1


Intrinsics 已经可以提供 ltgt 整数比较(但不是 gele)在 {{1 }} 硬件说明。

不这样做的一个原因是提醒只有右手操作数才能将负载折叠到内存源中。并且(没有 AVX)如果在比较之后还需要左侧,则需要复制左侧。或者只是在列表中使用更少的内在函数,或者更少的没有完全对应的 asm 指令。

这些是提供更多比较asm指令可能有意义的原因,但无论出于何种原因,x86 直到 AVX2 之后才出现。 AVX-512 最终确实提供了比较指令,将谓词作为立即数而不是操作码的一部分(如 pcmpgt),从而提供谓词的选择。 (cmppsvpcmpub/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)和一个 sltubnez想要 slt 给你零还是一。 (Greater than,less than equal,greater than equal in MIPS)。与 RISC-V 不同,MIPS 在设计上没有两个寄存器 beqzso 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 > bb < a 比较在实践中不方便。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res