AVX 内在 _mm256_cmp_ps 是不是应该在为真时返回 NaN?
Posted
技术标签:
【中文标题】AVX 内在 _mm256_cmp_ps 是不是应该在为真时返回 NaN?【英文标题】:Is AVX intrinsic _mm256_cmp_ps supposed to return NaN when true?AVX 内在 _mm256_cmp_ps 是否应该在为真时返回 NaN? 【发布时间】:2016-05-08 12:33:20 【问题描述】:当我尝试时:
__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);
这是一个
[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 的文档只是说它返回结果而不指定。
【问题讨论】:
结果全为 1,为真,恰好是一个 NaN。如果为 false,则全为 0,恰好是 0.0。通常,您将结果用作按位掩码,因此浮点值没有真正意义。 宏做了什么:“_CMP_LE_OQ”,OQ和OS有什么区别? 【参考方案1】:是的,返回值是一个位掩码:它设置为全零表示假,或全1表示真。当解释为 32 位浮点数时,32 位的 1 恰好是 NaN 的编码。
位掩码很有用,因为您可以使用它们来屏蔽某些结果,例如(A & M) | (B & ~M)
将在掩码 M
为真(全为 1)时选择 A
的值,在掩码为假(全为零)时选择 B
的值。
【讨论】:
以上是关于AVX 内在 _mm256_cmp_ps 是不是应该在为真时返回 NaN?的主要内容,如果未能解决你的问题,请参考以下文章
我在理解 AVX shuffle 内在函数如何为 8 位工作时遇到了一些问题
AVX2 1x mm256i 32bit 到 2x mm256i 64bit
_mm256_loadu2_m128i 内在函数在 g++ 下不可用?