NAN 的 SSE 比较 returns 向量

SSE comparison returns vector of NANs

我正在尝试这样的事情:

__m128 cA = _mm_set_ps1(-2.0f);
__m128 cB = _mm_set_ps1(2.0f);
__m128 df = _mm_cmpgt_ps(cA, cB);

在这种情况下 df returns 带零。

但如果我这样做:

__m128 cA = _mm_set_ps1(2.0f);
__m128 cB = _mm_set_ps1(-2.0f);
__m128 df = _mm_cmpgt_ps(cA, cB);

它 returns 所有 -nan 。这是预期的行为吗?如果是,我如何评估这些纳米?

使用英特尔 CPU、MS VisualStudio 2017

SIMD 比较生成掩码。 All-one 位是 -NaN 的 bit-pattern。 All-zero 位是 bit-pattern for +0.0

它们不应被解释为 float。将它们与 _mm_movemask_ps、混合或类似 _mm_and_ps.

的东西一起使用

例如_mm_and_ps( vec, cmp_result) 将比较为假的元素归零。您可以使用它通过在添加之前将一些输入元素归零来进行条件添加。


有关如何使用 SIMD 的更多信息,请查找 guide/tutorial。 https://whosebug.com/tags/sse/info