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?的主要内容,如果未能解决你的问题,请参考以下文章

AVX512 缺少内在的 _mm512_round_ps

我在理解 AVX shuffle 内在函数如何为 8 位工作时遇到了一些问题

AVX2 1x mm256i 32bit 到 2x mm256i 64bit

_mm256_loadu2_m128i 内在函数在 g++ 下不可用?

在 GCC 10.3.0 中找不到 _mm256_rem_epu64 内在函数

AVX2中的按位非/补码[重复]