【问题标题】:SSE comparison returns vector of NANsSSE 比较返回 NAN 向量
【发布时间】: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

标签: sse simd


【解决方案1】:

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

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2021-06-30
    • 2016-09-02
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多