gpt4 book ai didi

c - 使用 `setp` 而不是 `setb` 有优势吗?

转载 作者:太空狗 更新时间:2023-10-29 14:56:55 25 4
gpt4 key购买 nike

编译时

double isnan(double x){
return x!=x
}

两者都是clang and gcc utilize奇偶校验标志 PF:

_Z6is_nand: # @_Z6is_nand
ucomisd %xmm0, %xmm0
setp %al
retq

然而,the comparison 的两种可能结果是:

      NaN     Not-Nan
ZF 1 1
PF 1 0
CF 1 0

这意味着也可以使用 CF 标志作为替代,即 setb而不是 setp .

setb 相比,使用 setp 是否有任何优势,或者这两种编译器都使用奇偶校验标志是巧合吗?

PS:此题是Understanding compilation result for std::isnan的后续

最佳答案

优点是编译器自然发出这段代码,不需要特殊情况来识别 x!=x 并将其转换为 !(x >= x)

如果没有 -ffast-math,x != y 必须检查 PF 以查看比较是否有序,然后检查 ZF 是否相等。在两个输入相同的特殊情况下,大概像 CSE 这样的正常优化机制可以摆脱 ZF 检查,只留下 PF。

在这种情况下,setb 不会更糟,但它绝对没有优势,而且对人类来说更容易混淆,并且它可能需要更多特殊情况的代码供编译器使用发出它。

您建议的转换仅在将结果与使用 CF 的特殊指令一起使用时才有用,例如 adc。例如,nan_counter += arr[i] != arr[i]。自动矢量化很简单 (cmp_unord_ps/psubd),但标量清理(或非数组输入的标量用例)可以使用 ucomiss /adc $0, %eax 而不是 ucomiss/setp/add

这在 Broadwell 和更高版本以及 AMD 上保存了一条指令和一个 uop。 (早期的 Intel CPU 有 2 uop adc,除非它们是特殊情况 $0,因为它们不支持 3 输入 uops)

关于c - 使用 `setp` 而不是 `setb` 有优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51368746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com