使用 AVX 与 NaN 进行比较

2023-12-24

我正在尝试创建一个快速解码器BPSK使用AVX英特尔的内在本质。我有一组复数,它们表示为交错浮点数,但由于BPSK仅需要调制实部(或偶数索引浮点数)。每一个漂浮物x被映射到0, when x < 0 and to 1 if x >= 0。这是使用以下例程完成的:

static inline void
normalize_bpsk_constellation_points(int32_t *out, const complex_t *in, size_t num)
{
    static const __m256             _min_mask = _mm256_set1_ps(-1.0);
    static const __m256             _max_mask = _mm256_set1_ps(1.0);
    static const __m256             _mul_mask = _mm256_set1_ps(0.5);

    __m256                          res;
    __m256i                         int_res;

    size_t i;
    gr_complex                      temp;
    float                           real;

    for(i = 0; i < num; i += COMPLEX_PER_AVX_REG){
            res = _mm256_load_ps((float *)&in[i]);

            /* clamp them to avoid segmentation faults due to indexing */
            res = _mm256_max_ps(_min_mask, _mm256_min_ps(_max_mask, res));

            /* Scale accordingly for proper indexing -1->0, 1->1 */
            res = _mm256_add_ps(res, _max_mask);
            res = _mm256_mul_ps(res, _mul_mask);

            /* And then round to the nearest integer */
            res = _mm256_round_ps(res, _MM_FROUND_TO_NEAREST_INT |_MM_FROUND_NO_EXC);

            int_res = _mm256_cvtps_epi32(res);

            _mm256_store_si256((__m256i *) &out[2*i], int_res);
    }
}

首先,我将所有收到的浮点数钳位在范围内[-1, 1]。然后,经过适当的缩放后,结果将四舍五入为最接近的整数。这将映射上面的所有浮动0.5 to 1和下面的所有浮动0.5 to 0.

如果输入浮点数是普通数字,则该过程可以正常工作。但由于前几个阶段的一些情况,有可能会出现一些输入的浮点数NaN or -NaN。在这种情况下,“NaN”数字通过_mm256_max_ps(), _mm256_min_ps()和所有其他AVX产生整数映射的函数-2147483648这当然会导致我的程序由于无效索引而崩溃。

是否有任何解决方法可以避免此问题,或者至少设置NaN to 0 using AVX?


你可以用简单的方法开始,比较和屏蔽:(未经测试)

res = _mm256_cmp_ps(res, _mm256_setzero_ps(), _CMP_NLT_US);
ires = _mm256_srl_epi32(_mm256_castps_si256(res), 31);

或者移位和异或:(也未测试)

ires = _mm256_srl_epi32(_mm256_castps_si256(res), 31);
ires = _mm256_xor_epi32(ires, _mm256_set1_epi32(1));

此版本还将关心 NaN 的符号(并忽略 NaN 性)。

没有 AVX2 的替代方案(未测试)

res = _mm256_cmp_ps(res, _mm256_setzero_ps(), _CMP_NLT_US);
res = _mm256_and_ps(res, _mm256_set1_ps(1.0f));
ires = _mm256_cvtps_epi32(res);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 AVX 与 NaN 进行比较 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 在C语言中使用“void”

    我很困惑为什么我们需要通过void转换为 C 函数 int f void return 0 versus int f return 0 什么是正确的做法以及为什么 In C int f 是一种老式的声明 它说f需要固定但未指定数量和类型的参
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • 在 Observable Angular js 2 中迭代 json 字符串

    以下是我的html代码 tr td c name td td c skill td tr 在我的 json 中 name abc skill xyz 这是可行的 但我需要迭代这个 json 字符串 var obj a 1 b 2 for v
  • 如何在运行时重新转换类?

    我正在尝试修改一个已加载到 JVM 中的类 我找到的解决方案是这样的 将代理附加到 PID 指定的 JVM 例如8191 代码 AttachTest 从 JVM 中已加载的类中找到您要修改的类 例如 8191 使用仪器添加变压器 代码 Ag
  • C++ 进程因状态 3 混乱而终止

    我对编程非常陌生 但在过去一周左右的时间里一直在关注 C 教程并积累了许多 PDF 来帮助我 我在其中或网上找不到任何足够清楚地回答我的问题的内容 请原谅我的新手 相关代码 日志文件 hpp HEADER CLASS INTERFACE F
  • 检索 Linkedin 视频帖子 (ugcPost API) 的缩略图

    我尝试使用 ugcPost api 检索视频帖子的缩略图 但没有成功 我总是检索一个空的缩略图数组 关于文档检索 UGC 帖子 https learn microsoft com en us linkedin marketing integ
  • 什么时候在keras中使用sample_weights合适?

    根据这个question https stackoverflow com questions 43459317 keras class weight vs sample weights in the fit generator 我了解到cl
  • SonarQube:无法停用缺少质量配置文件的规则

    我的 SonarQube 中有一条规则 在搜索列表中没有与其关联的质量配置文件 红色框here https i stack imgur com UHnQG png 当我尝试改变它时我得到这个错误 https i stack imgur co
  • 通过缓动水平滑动 div

    我希望实现一个隐藏 显示 div 其中鼠标输入 div 显示 但以从左到右滑动的方式缓动 另外 我需要页面关注刚刚滑出 可见的新 div 这是我的脚本 关于我需要添加什么的任何想法
  • Delayed_job 锁定但不处理

    我正在尝试解决delayed job 的问题 由于某种原因 我看到很多作业locked by和locked at 但队列中没有任何内容被处理 有什么建议可以解释为什么会发生这种情况或如何让它继续下去吗 我正在使用 Rails 2 3 11
  • AngularJS - ngOptions:如何按组名称然后按标签排序

    假设我有以下形式的数据数组 var data group GroupA label BB group GroupB label DD 我的绑定会是这样的
  • 签署使用 maven- assembly 插件创建的 jar 文件

    我想构建一个程序集然后对其进行签名 我的问题是 jarsigner 不签署程序集 只签署独立的 jar 文件 你能告诉我问题是什么吗 在使用 Ant 多年后 Maven 对我来说似乎很 神奇 我看不到插件如何协作以及相互传递信息的方式 执行
  • HTML 正文中的样式和脚本标记...为什么不呢?

    这与这个问题 https stackoverflow com questions 225828 但不是因为它与电子邮件无关 在许多情况下 尤其是在使用 CMS 或其他人的框架时 嵌入要容易得多
  • 导入错误:没有名为“加密”的模块

    我在 Windows 7 上安装了 python 3 4 当尝试使用 paramiko 时出现此错误 import paramiko File C Python34 lib site packages paramiko 2 0 2 py3
  • 是否应该为已发布的应用程序关闭 NSZombieEnabled?

    With NSZombieEnabled打开它会提供一些防范EXC BAD ACCESS运行时发生的问题 我正在双重努力以确保没有 很少内存泄漏 但我可能会过度释放 所以有NSZombieEnabled打开将有助于防止这种情况 对吗 或者与
  • C# - 正确加载索引彩色图像文件

    所以我创建了一个索引颜色 每像素 8 位 PNG 我已经用 ImageMagick 检查了格式是否正确 我想将它从磁盘加载到System Drawing Bitmap同时保留 8bpp 像素格式 以便查看 和操作 其调色板 但是 如果我创建
  • 将 scikit-learn SVM 模型转换为 LibSVM

    我使用 scikit learn 训练了超过半 TB 的数据的 SVM svc 该模型运行良好 我需要将其移植到 C 但我不想从头开始重新训练 SVM 因为这对我来说花费的时间太长 有没有办法轻松导出 scikit learn 生成的模型并
  • Android:通知操作以消除通知

    我正在尝试创建带有操作按钮的 Android 通知 我已经设置了一个启动活动的设置 但我想要另一个可以取消通知并且不会将用户带到另一个屏幕 活动 不带到我的应用程序的任何部分 的设置 我不想使用 auto cancel true 因为我希望
  • 读取 pandas 数据帧前几行的方法

    有没有内置的使用方法read csv只读第一个n文件的行数而不提前知道行的长度 我有一个大文件 需要很长时间才能读取 有时只想使用前 20 行来获取它的样本 并且不喜欢加载完整的文件并获取它的头部 如果我知道总行数我可以做类似的事情foot
  • PHPUnit 和全局变量

    我正在学习和探索 PHPUnit 与 PHP 5 2 9 的应用程序 并遇到了全局问题 我已将 backupGlobals 设置为 FALSE 包括文档 backupGlobals 已禁用 这似乎不会影响 PHPUnit 备份全局变量的行为
  • 您可以通过使用其构造函数来创建嵌套列表的深层副本吗?

    我知道你可以给出一个列表对象作为列表构造函数的参数copy1 列出另一个 通过这样做 您可以创建一个深拷贝如果使用的类型是简单的内置一次 到底是哪个 例如类型string List
  • 使用 AVX 与 NaN 进行比较

    我正在尝试创建一个快速解码器BPSK使用AVX英特尔的内在本质 我有一组复数 它们表示为交错浮点数 但由于BPSK仅需要调制实部 或偶数索引浮点数 每一个漂浮物x被映射到0 when x lt 0 and to 1 if x gt 0 这是