有序比较与无序比较

1、简介

在Intel的SSE操作中,有“有序比较”和“无序比较”两种操作。

CMPORDPS – ordered compare packed singles
CMPUNORDPS – unordered compare packed singles

一次有序比较检查是否两个操作数都不是NaN。
一次无序比较检查两个操作数中是否任意一个操作数是NaN。

NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。

以下链接给出了更多相关信息:
csapp.cs.cmu.edu/public/waside/waside-sse.pdf (section 5)

2、示例

与NaN的比较结果是不确定的(无法确定结果),
因此,有序/无序比较用来检查是否是这种情况。

得到以下结果:

Result:
0
-1
-1
0
0
-1

NaN和1.0的有序比较结果是false。
NaN和1.0的无序比较结果是true。
1.0和1.0的有序比较结果是true。
1.0和1.0的无序比较结果是false。
NaN和NaN的有序比较结果是false。
NaN和NaN的无序比较结果是true。

例如,两个操作数op1和op2,两个操作数均包含4个单精度32位浮点值。

3、应用
_mm512_cmp_epi8_mask()

参考:
(在进行跨平台代码移植过程中,遇到了这个问题,感谢黄博提供思路)
stackoverflow.com/questions/8627331/what-does-ordered-unordered-comparison-mean
baike.baidu.com/item/nan/7455322

————————————————————

原创文章,转载请注明: 转载自孙希栋的博客

本文链接地址: 《有序比较与无序比较》

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll Up