使用 ARM NEON 汇编对 atan2 进行 SIMD 向量化

2023-12-02

我想使用 neon 指令 SIMD 和臂组件来计算 4 个点的大小和角度。大多数语言都有一个内置库,在我的例子中是 C++,它计算角度 (atan2),但仅针对一对浮点变量(x 和 y)。我想利用处理 q 寄存器的 SIMD 指令来计算 4 个值向量的 atan2 。

精度要求不高,速度更重要。


我已经有一些汇编指令可以计算 4 个浮点寄存器的大小,对于我的应用程序来说具有可接受的精度。 q1 包含 4 个“x”值(x1、x2、x3、x4)。 q2 包含 4 个“y”值(y1、y2、y3、y4)。 q7 包含 4 个结果的大小 (x1^2 + y1^2、x2^2 + y2^2、x3^2 + y3^2、x4^2 + y4^2)。

vmul.f32 q7, q1, q1  
vmla.f32 q7, q2, q2    
vrecpe.f32  q7, q7   
vrsqrte.f32 q7, q7 

使用 SIMD 指令计算两个向量的近似 atan2 的最快方法是什么?


See 数学霓虹灯对于现有的单值浮点实现。由于它没有(或很少)条件,它应该很好地转换为SIMD执行。

由于 ARM NEON 没有直接计算该值的指令,因此有多种技术可以创建比直接计算更好的近似值泰勒级数。具体来说,min-max方法给出了一个很好的近似多项式候选。min-max指最小化最大误差;与一个切比雪夫近似通常都非常好。

DSP guru有不同方法的具体细节函数逼近。网上还有大量书籍。您可以使用搜索最佳多项式matlab, octave或其他一些工具包。通常,您需要将其与range and 精确。一旦你对单个值有了一个好的算法,就可以将其扩展到SIMD任何形式都应该是微不足道的。

问题计算atan2有参考苹果的atan.c来源。代码中的系数很可能源自我上面给出的内容。这段代码的问题是它不能扩展到SIMD以及atan()近似是分段的,根据范围需要不同的系数。为您SIMD,您将需要在整个范围内使用相同的系数(乘数、除数、方程)。

Abramowitz 和 Stegun:数学函数手册有一个章节是关于循环函数第 4.4.28 节给出了对数公式。这似乎类似于eglibc执行。

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

使用 ARM NEON 汇编对 atan2 进行 SIMD 向量化 的相关文章

  • 尝试理解 printf() 的 gcc 汇编输出

    我正在尝试学习如何理解汇编代码 因此我一直在研究 GCC 的汇编输出以获取一些愚蠢的程序 其中之一只不过是int i 0 我现在或多或少完全理解了其中的代码 最大的困难是理解散布的 GAS 指令 无论如何 我向前迈了一步并添加了printf
  • 在 ARM Cortex-M3 中使用 newlib 的 malloc

    我正在为 ARM Cortex M3 NXP 的 LCP17xx 创建代码 到目前为止我一直在使用静态内存 一切都运行良好 我尝试添加动态内存支持 但是一旦调用 malloc 系统就会卡住 我正在使用 gcc 为 Arm Bare Meta
  • 什么是 .axf 文件?

    我是arm架构的新手 我从事嵌入式软件工作 并试图了解我的项目二进制文件的调试文件夹中存在的 axf文件 发现它是链接器在构建过程中生成的arm可执行格式文件 用于调试崩溃 所以很明显它包含了一些调试信息 但不清楚具体是什么信息 而且deb
  • 如何从内存加载值而不污染缓存?

    我想读取内存位置而不污染缓存 我正在 X86 Linux 机器上工作 我尝试使用 MOVNTDQA 汇编指令 asm movntdqa source dest n t dest x my var source m my mem 0 memo
  • 尝试了解 ARM 二进制映像中的加载内存地址 (LMA) 和二进制文件偏移量

    我在一家ARM 皮质 M4 STM32F4xxxx 我试图了解二进制文件 elf and bin 在内存中构建并闪存 特别是关于内存位置 具体来说 我不明白的是LMA从实际的二进制文件偏移量进行 翻译 让我用一个例子来解释一下 我有一个 e
  • 在汇编中初始化字符串数组

    我想创建一个数据数组 在初始化数据部分保存 5 个字符串 每个字符串正好有 4 个字符 每个字符串都有一些初始数据 例如第一个字符串的 abcd 第二个字符串的 efgh 等等 无效的 0任何字符串都不需要字符 如何用汇编语言初始化字符串数
  • 如何在数据部分(RAM)中保留一定范围的内存并防止同一应用程序使用该内存的堆/堆栈?

    我想在 RAM 中保留 分配一定范围的内存 并且同一应用程序不应覆盖或使用该范围的内存进行堆 堆栈存储 如何在内存中分配一定范围的内存以防止堆栈 堆覆盖 我考虑过向应用程序本身添加 或分配 一个数组并保留内存 但它被编译器优化了 因为它在应
  • 更新 MMU 转换表的正确方法是什么

    我在我的 s3c2440 板上启用了 MMU 3G 4G 内存 故障属性 当我没有读 写 3G 4G 内存时一切都很好 所以为了测试页面错误向量 我写入了 0xFF 3G地址 正如我所料 我从FSR中得到了正确的值 所以我在 do page
  • Nasm 点状标签

    我对 TASM 很熟悉 但对 NASM 不太了解 我读过 NASM 允许使用本地标签 这些标签在名称前用点表示 例如 代码 loop some code jmp loop 定义一个名为 loop的局部标号 引用的地址在后面的jmp指令中使用
  • 问题与 Assembly x86-32 RET n 指令有关

    我知道 Ret n 的含义 但我无法弄清楚它在维护程序运行时堆栈方面的作用 我在那里有点困惑 ret 和栈有关系吗 ret n就好像ret add esp n 您可以将其用于 caller pops 调用约定 Plain ret就好像pop
  • 计算PE文件中入口点的文件偏移量

    In http en redinskala com finding the ep http en redinskala com finding the ep 有关于如何查找 exe 文件中入口点的文件偏移量的信息 在这里我可以读到 EP 文
  • 使用嵌套 if 子句向量化循环

    Problem 我正在尝试优化代码的运行时 并且之前曾提出过类似的问题 其中包括几个嵌套的 if 语句 向量化嵌套 if 语句 https stackoverflow com questions 38125770 vectorizing n
  • 如何将 4 位十六进制转换为 7 位 ASCII?

    作业是通过编写一个可以在 4 位十六进制和 7 位 ASCII 之间转换的子程序来学习汇编编程 起初我不知道 但经过一些研究后 我可以做出努力并绘制流程图并制作程序 但它并不完全正确 所以我请求您的指导来帮助我解决这个问题 实际的作业文本是
  • 编译器在这里做了什么,允许通过很少的实际比较来完成许多值的比较?

    我的问题是编译器在这种情况下正在做什么 它对代码的优化程度超出了我的想象 鉴于此枚举 enum MyEnum Entry1 Entry2 Entry3 27 are the same omitted for size Entry28 Ent
  • 深入了解事物如何打印到屏幕上(cout、printf)以及我在教科书上似乎找不到的真正复杂内容的起源

    我一直想知道这个问题 但至今还没有找到答案 每当我们使用 cout 或 printf 时 它们到底是如何打印在屏幕上的 文本是如何显示出来的 这里可能是一个相当模糊的问题 无论你给我什么 我都会工作 那么基本上这些功能是如何制作的 是汇编吗
  • 如何向量化 pandas 数据框中的比较?

    我有数据框的一部分df像这样 nr Time Event 70 8 70 0 70 0 74 52 74 12 74 0 我想将事件分配给最后一列 默认情况下 第一个条目为 1 If Time i lt 7 and nr i nr i 1
  • 从 GP regs 加载 xmm

    假设您的价值观是rax and rdx你想加载到xmm登记 一种方法是 movq xmm0 rax pinsrq xmm0 rdx 1 虽然速度相当慢 有没有更好的办法 在最近的 Intel 或 AMD 上 你不会在延迟或 uop 计数方面
  • 了解使用内存源操作数和 x87 fcomi / fcmov 的 GCC 内联汇编代码

    我正在阅读研究论文Privado 实用且安全的 DNN 推理 用于隐藏依赖于输入的分支 https arxiv org pdf 1810 00602 pdf 我试图理解该论文中的以下 GCC 汇编代码 float temp asm vola
  • .so 文件的 objdump?需要帮助来理解消息

    我正在开发一个与流相关的本机应用程序 我在我的 c 模块中遇到了一些问题 我收到的是来自 Logcat 的一些消息 这是 Logcat 消息 INFO DEBUG 28 Build fingerprint generic sdk gener
  • 当价格低于阈值时使用 pandas DataFrame 实施矢量化止损

    给出这个示例数据框 date close signal positions 2017 01 02 27 90 0 0 0 0 2017 01 03 27 76 0 0 0 0 2017 01 04 28 65 1 0 1 0 2017 01

随机推荐

  • 将 SmallInt 与 Ord 函数的结果进行比较时的警告

    我正在比较一个SmallInt变量与结果Ord功能 例子 var MySmallInt SmallInt begin MySmallInt 5 if MySmallInt gt Ord C then ShowMessage True els
  • 是否可以更改 C# 中的对象类型

    为了满足客户的要求 我遇到了一些问题 我将尽力使示例保持简单 只是给出问题的想法并希望提出解决方案 此时我们有一个类 Shape 例如 形状有一些特殊化 它可以是正方形 三角形等 到目前为止一切都很好 一切都很好 现在 出于某种原因 我的客
  • SRSS 2008 R2 的 C# 报表呈现器 - 缺少参数

    我正在使用 C 呈现来自 SRSS 2008 R2 的报告 该报告有参数 很长一段时间我在渲染输出时都没有问题 然而今天它决定行不通了 这是错误 ReportServerException This report requires a de
  • 根据生成构建文件时不可用的源文件在 CMake 中创建库

    我有一个构建两个库的 CMake 配置文件 第三方库 此处称为 ThirdPartyLib 包含来自供应商的实时操作系统 主板支持包 它是使用 autotools 工具链在 CMake 外部构建的 前一个库的扩展版本 此处称为 Extend
  • 为什么 Maven 在安装过程中可能会忽略更新的类?

    在进行 war 安装时 我在 Maven 2 2 1 安装中看到了奇怪的行为 有时 我会更新一个类 但更新的版本没有打包在 mvn install 生成的工件中 到目前为止 我已经确定在目标目录中生成了更新的 class文件 并且生成的 w
  • 在phantomjs中设置一个字符串作为网页的响应

    嗨 我想做的不是将网页获取为 page open url 而是设置一个已经作为页面响应检索到的字符串 可以吗 是的 就像分配给 page content 一样简单 通常还值得设置一个 page url 否则 如果使用 Ajax SSE 等进
  • WSO2 身份服务器电子邮件作为用户名

    我们目前正在评估 WSO2 身份服务器 我们想使用电子邮件地址作为用户名 默认情况下 用户名是 30 个字符 不够长 而且它必须同时支持两者 和用户名中的 有没有办法配置这个 用户存储是一个 JDBC Mysql 存储 Thanks 是的
  • 实时更新网页

    我正在制作一款类似于 Risk 的基于浏览器的多人回合制策略游戏 现在 最简单的方法似乎就是让它像普通网页一样 每次玩家刷新时 网页都会向数据库查询所需的信息 这是可以接受的 但我更愿意实时更新页面 这样玩家就不必不断刷新页面 我可以让网页
  • 导出 ES6 模块中的多个类

    我正在尝试创建一个导出多个 ES6 类的模块 假设我有以下目录结构 my module Foo js Bar js index js Foo js and Bar js每个导出一个默认的 ES6 类 Foo js export defaul
  • 在应用程序工厂之外访问 Flask 配置

    我目前正在使用带有蓝图的 Flask 应用程序工厂模式 我遇到的问题是如何访问应用程序工厂之外的 app config 对象 我不需要 Flask 应用程序中的所有配置选项 我只需要6把钥匙 因此 我当前执行此操作的方法是在调用 creat
  • 使用变量从 SSIS 执行进程任务运行 SQLCMD 脚本

    我有一个 sql 文件 其中包含包含 SQLCMD 元素的脚本 我需要让它从 SSIS 包运行 我无法从 执行SQL Task 根据这个http www sqlservercentral com Forums Topic818940 147
  • Python 神经网络中不需要的 [Nan] 输出

    这里是新手 刚刚从 JS 切换到 Python 来构建神经网络 但从中获得了 Nan 输出 奇怪的是我的 sigmoid 函数 似乎没有遇到任何溢出 但导数会导致混乱 import numpy as np def sigmoid x ret
  • 反向网格排列?

    我的右侧有一个侧边栏 左侧有内容 div class col md 9 p Main At large zoom currently it goes to top I want it to go to the bottom p div di
  • array_merge 和 array + array 有什么区别? [复制]

    这个问题在这里已经有答案了 一个相当简单的问题 有什么区别 merged array merge array1 array2 and merged array1 array2 这是一个简单的说明性测试 ar1 0 gt 1 0 a gt 1
  • Cocos2d 应用中的 NSTimer

    Cocos2d 文档中写道 使用 NSTimer 不是一个好主意 为什么不推荐使用NSTimer 我知道Cocos2d有一个schedule方法 尽量不要使用 Cocoa 的 NSTimer 而是使用 cocos2d 自己的调度程序 如果您
  • 通过 TCP/IP 接收对象

    我将通过 TCP IP 编写一个程序 我应该通过客户端或服务器发送对象 当我想发送或接收字符串但当我尝试读取对象时 它会正常进行 private Socket client public ThreadedClient Socket clie
  • 使用 applicationcontext.getbean 与 @configurable 的优点[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 使用有什么好处 可配置与上
  • 从原始资源文件夹播放 .MP4 视频

    我见过很多类似的问题 但到目前为止我还没有能够解决任何问题 我正在尝试从 res raw 文件夹播放视频 MP4 但只获得音频 没有视频 视频很短 约3秒 很小 350KB 如果我将视频直接放在设备 Motorola Droid 上 它可以
  • 下载之前如何知道文件的大小?

    我必须下载一个文件并且我正在使用这段代码 这基本上是一个AsyncTask这是为了更新进度条 但是 由于我不知道文件大小是多少 所以我不得不使用旋转进度条 那么 如何在开始下载之前获取文件大小 以便我可以使用正常的进度条 你可以获得一个名为
  • 使用 ARM NEON 汇编对 atan2 进行 SIMD 向量化

    我想使用 neon 指令 SIMD 和臂组件来计算 4 个点的大小和角度 大多数语言都有一个内置库 在我的例子中是 C 它计算角度 atan2 但仅针对一对浮点变量 x 和 y 我想利用处理 q 寄存器的 SIMD 指令来计算 4 个值向量