AVX固有的_mm256_cmp_ps应该为true时返回NaN吗?

use*_*596 3 c++ simd avx

当我尝试:

__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);
Run Code Online (Sandbox Code Playgroud)

我得到的输出是<b:

[0, 0, 0, 0, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

但是当尝试:

__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);
Run Code Online (Sandbox Code Playgroud)

要么

__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);
Run Code Online (Sandbox Code Playgroud)

我懂了

[NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?https://software.intel.com/zh-cn/node/524077上的文档只是说它返回结果而未指定。

Ruu*_*uud 5

是的,返回的值是位掩码:对于false,将其设置为全零,对于true,将其设置为全1。当解释为32位浮点型时,其中的32位恰好是NaN的编码。

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