sse - SSE 比较返回 NAN 向量
问题描述
我正在尝试这样的事情:
__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
解决方案
SIMD 比较产生一个掩码。全一位是-NaN
. 全零位是位模式+0.0
它们不打算被解释为float
. 将它们与_mm_movemask_ps
、混合或类似的东西一起使用_mm_and_ps
。
例如_mm_and_ps( vec, cmp_result)
,将比较为假的元素归零。您可以通过在添加之前将一些输入元素归零来使用它来执行条件添加。
有关如何使用 SIMD 的更多信息,请查看指南/教程。 https://stackoverflow.com/tags/sse/info
推荐阅读
- c++ - 用于方法组和装饰器的 C++ SFINAE
- html - 并排浮动两个 div 并保持它们之间的恒定距离
- javascript - 为什么奇怪的数据会来到服务器和浏览器控制台?
- javascript - Node JS Sequelize 连接查询
- javascript - 当用户在输入字段上键入时,如何替换某些字符?
- python - 使用 Folium 将多个 Geojson 传单添加到一张地图时如何正确使用样式功能?
- javascript - 如何验证该字段大于仅在检查特定按钮时
- razor - 在 Blazor 项目中的 Razor 页面之间共享代码
- javascript - 如何在 React JS 中呈现 API 响应?
- c++ - 从 std::array 私有继承时无法从 std::initializer_list 构造