SSE 比较返回 NAN 向量

Posted

技术标签:

【中文标题】SSE 比较返回 NAN 向量【英文标题】:SSE comparison returns vector of NANs 【发布时间】:2019-07-18 10:02:02 【问题描述】:

我正在尝试这样的事情:

__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 。是预期的行为吗?如果是,我如何评估那些nans?

使用英特尔 CPU,MS VisualStudio 2017

【问题讨论】:

@MarcGlisse “比较 a 和 b 中的压缩单精度(32 位)浮点元素是否大于,并将结果存储在 dst 中。”我假设它返回掩码。否? 如果读取为浮点数,所有设置位的掩码也是负 nan 【参考方案1】:

SIMD 比较产生一个掩码。全一位是-NaN 的位模式。全零位是+0.0的位模式

它们不打算被解释为float。将它们与_mm_movemask_ps、混合或_mm_and_ps 之类的东西一起使用。

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


有关如何使用 SIMD 的更多信息,请查看指南/教程。 https://***.com/tags/sse/info

【讨论】:

以上是关于SSE 比较返回 NAN 向量的主要内容,如果未能解决你的问题,请参考以下文章

使用 SSE 缩放复杂向量

matlab SVM 返回 NaN

尝试在 SSE 编程中使用和掩码添加 __m128

将两个向量<bool> 与 SSE 进行比较

将 Double.NaN 与自身进行比较

服务器端事件发送SSE