AVX内在_mm256_cmp_ps是否应在为true时返回NaN

Is AVX intrinsic _mm256_cmp_ps supposed to return NaN when true?

本文关键字:true 返回 NaN 是否 mm256 内在 cmp ps AVX      更新时间:2023-10-16

当我尝试时:

__m256 a = _mm256_set_ps(1, 1, 1, 1, 1, 1, 1, 1);
__m256 b = _mm256_set_ps(0, 0, 0, 0, 0, 0, 0, 0);
__m256 c = _mm256_cmp_ps(a, b, _CMP_LT_OQ);

这是<b我得到输出:

[0, 0, 0, 0, 0, 0, 0, 0]

但尝试时:

__m256 a = _mm256_set_ps(1, 1, 1, 1, 1, 1, 1, 1);
__m256 b = _mm256_set_ps(0, 0, 0, 0, 0, 0, 0, 0);
__m256 c = _mm256_cmp_ps(b, a, _CMP_LT_OQ);

__m256 a = _mm256_set_ps(1, 1, 1, 1, 1, 1, 1, 1);
__m256 b = _mm256_set_ps(0, 0, 0, 0, 0, 0, 0, 0);
__m256 c = _mm256_cmp_ps(a, b, _CMP_GT_OQ);

我得到

[NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]

这是意料之中的行为吗?文档位于https://software.intel.com/en-us/node/524077只是说它返回结果而没有指定。

是的,返回的值是一个位掩码:它被设置为全零表示false,或者全一表示true。当被解释为32位浮点时,1中的32位恰好是NaN的编码。

位掩码很有用,因为您可以使用它们来屏蔽某些结果,例如,当掩码M为true(全为1)时,(A & M) | (B & ~M)将选择A的值,而当掩码为false(全为0)时,则选择B的值。