当我尝试:
__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处的文档只是说它返回结果而没有指定。
答案 0 :(得分:5)
是的,返回的值是一个位掩码:它设置为全零为false,或全部为true。当解释为32位浮点数时,32位的NaN编码正好。
Bitmasks非常有用,因为您可以使用它们来屏蔽某些结果,例如:当掩码(A & M) | (B & ~M)
为真(全部为1)时,A
将选择M
的值,而当掩码为假(全为零)时,B
的值将选择 col
['','','5','']
['','8']
['6','','']
['7']
[]
['5']
的值。