我正在尝试这样的事情:
__m128 cA = _mm_set_ps1(-2.0f);
__m128 cB = _mm_set_ps1(2.0f);
__m128 df = _mm_cmpgt_ps(cA, cB);
在这种情况下,df
返回零。
但如果我这样做:
__m128 cA = _mm_set_ps1(2.0f);
__m128 cB = _mm_set_ps1(-2.0f);
__m128 df = _mm_cmpgt_ps(cA, cB);
它返回所有-nan
。这是预期的行为吗?如果是的话,我该如何评估那些难解?
使用Intel CPU,MS VisualStudio 2017
答案 0 :(得分:3)
SIMD比较产生一个掩码。全1位是-NaN
的位模式。全零位是+0.0
它们不应解释为float
。将它们与_mm_movemask_ps
,混合或类似_mm_and_ps
的东西一起使用。
例如_mm_and_ps( vec, cmp_result)
将比较为假的元素归零。您可以通过在添加之前将一些输入元素清零来使用此条件进行条件添加。
有关如何使用SIMD的更多信息,请查阅指南/教程。 https://stackoverflow.com/tags/sse/info