AVX 内在 _mm256_cmp_ps 是否应该 return NaN 为真?
Is AVX intrinsic _mm256_cmp_ps supposed to return NaN when true?
当我尝试时:
__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);
哪个是 a < 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 的文档只是说 returns 结果没有指定。
是的,返回值是一个位掩码:它被设置为全零表示假,或全为真。当解释为 32 位浮点数时,32 位的 1 恰好是 NaN 的编码。
位掩码很有用,因为您可以使用它们来屏蔽某些结果,例如(A & M) | (B & ~M)
将 select 当掩码 M
为真(全一)时 A
的值和当掩码为假(全零)时 B
的值).
当我尝试时:
__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);
哪个是 a < 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 的文档只是说 returns 结果没有指定。
是的,返回值是一个位掩码:它被设置为全零表示假,或全为真。当解释为 32 位浮点数时,32 位的 1 恰好是 NaN 的编码。
位掩码很有用,因为您可以使用它们来屏蔽某些结果,例如(A & M) | (B & ~M)
将 select 当掩码 M
为真(全一)时 A
的值和当掩码为假(全零)时 B
的值).