使用 ARM NEON 内在函数添加 alpha 和排列

2024-04-10

我正在开发一个 iOS 应用程序,需要相当快地将图像从 RGB -> BGRA 转换。如果可能的话,我想使用 NEON 内在函数。有没有比简单分配组件更快的方法?

void neonPermuteRGBtoBGRA(unsigned char* src, unsigned char* dst, int numPix)
{
    numPix /= 8; //process 8 pixels at a time

    uint8x8_t alpha = vdup_n_u8 (0xff);

    for (int i=0; i<numPix; i++)
    {
        uint8x8x3_t rgb  = vld3_u8 (src);
        uint8x8x4_t bgra;

        bgra.val[0] = rgb.val[2]; //these lines are slow
        bgra.val[1] = rgb.val[1]; //these lines are slow 
        bgra.val[2] = rgb.val[0]; //these lines are slow

        bgra.val[3] = alpha;

        vst4_u8(dst, bgra);

        src += 8*3;
        dst += 8*4;
    }


}

ARMCC 反汇编也不是那么快:

  • 它没有使用最合适的说明

  • 它将 VFP 指令与 NEON 指令混合在一起,每次都会造成巨大的问题

尝试这个 :

  mov r2, r2, lsr #3
  vmov.u8, d3, #0xff
loop:
  vld3.8 {d0-d2}, [r0]!
  subs r2, r2, #1
  vswp d0, d2
  vst4.8 {d0-d3}, [r1]!
  bgt loop

  bx lr

我建议的代码也没有完全优化,但进一步的“真正”优化会严重损害可读性。所以我就停在这里。

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

使用 ARM NEON 内在函数添加 alpha 和排列 的相关文章

  • 为什么无符号类型在arm cpu中效率更高?

    我正在阅读手臂手册并提出这个建议 但没有提到原因 为什么无符号类型更快 在 ARMv4 之前 ARM 没有对加载半字和有符号字节的本机支持 要加载有符号的字节 你必须LDRB然后对值进行符号扩展 LSL那就起来吧ASR它回落 这很痛苦所以c
  • 手臂 g++ 中缺少一些东西

    我安装了 CodeSourcery g 工具链并尝试编译一个简单的 hello world 程序 include
  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • 使用 movsd 让编译器复制字符

    我想在时间关键的函数中复制相对较短的内存序列 小于 1 KB 通常为 2 200 字节 CPU 端的最佳代码似乎是rep movsd 但是我不知何故无法让我的编译器生成此代码 我希望 我隐约记得看到过 使用 memcpy 可以使用编译器内置
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • ARM Neon:如何从 uint8x16_t 转换为 uint8x8x2_t?

    我最近发现了关于vreinterpret q dsttype src类型转换运算符 https stackoverflow com a 43519190 2436175 但是 这似乎不支持所描述的数据类型的转换这个链接 http infoc
  • ARM 汇编分支到寄存器或内存内部的地址

    我想知道在 ARM 汇编中我可以使用哪条指令分支到存储在某个内存地址中的地址或标签 例如 我们可以使用B LABEL来跳转到LABEL 但现在目的地只能在运行时知道 并且它存储在某个已知的内存位置 是否有类似 B 地址 的东西 Thanks
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • ARM架构中不同处理器模式下如何使用内核堆栈?

    据我了解 每个进程都有一个用户堆栈和内核堆栈 除此之外 ARM 架构中的每种模式都有一个堆栈 所以我想知道不同的堆栈和堆栈指针在 ARM 模式下如何工作 另外 何时会使用与进程关联的内核堆栈 何时会使用与进程关联的内核堆栈 当您进行系统调用
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • SSE、内在函数和对齐

    我使用大量 SSE 编译器内在函数编写了一个 3D 矢量类 一切都工作正常 直到我开始使用 new 来实例化具有 3D 向量作为成员的类 我在发布模式下经历了奇怪的崩溃 但在调试模式下却没有 反之亦然 因此 我阅读了一些文章 并认为我需要将
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin

随机推荐

  • 为什么在音频标签内使用源标签会阻止 loaddata 事件触发?

    为了更好的可访问性 我们需要第二组替代的播放 暂停控件和 在用户 Kento Nishi 的帮助下 我们成功搬离DEMO A https jsfiddle net j5oxhq38 只有 1 个音频播放控件 DEMO B https jsf
  • 在 selenium 中将页面向上滚动到顶部

    如何将网页滚动到页面顶部 我知道将页面滚动到底部是 window scrollTo 0 document body scrollHeight 就像这样可以将页面滚动到顶部吗 要滚动到页面顶部 只需滚动到0 0 window scrollTo
  • Jest + React-testing-library - 等待模拟的异步函数完成

    My componentDidMount 触发对异步函数的调用 但根据该函数的结果 它可能不会导致任何 DOM 更改 有什么方法可以等待该函数在测试中完成吗 这是一个示例 单击按钮最初被禁用 如果异步函数返回 true 则应启用单击按钮 m
  • Magento 多个 Authorize.net 网关

    我有一个用于处理信用卡付款的 CAD 和 USD 网关帐户 这两个帐户均来自支持 Authorize net API 的支付提供商 我已经使用 Magento 的内置 Authorize net 支持成功配置了一个 但是如何配置第二个 Au
  • 在终结器中抛出异常以强制执行 Dispose 调用:

    这是我认为推荐的典型 IDisposable 实现 SomeClass Dispose false public void Dispose GC SuppressFinalize this Dispose true protected vi
  • 使用 Youtube API 和 onBehalfOfContentOwner 的 CMS 频道列表

    我正在使用 Youtube Data API 进行有针对性的查询 就像这个例子 https developers google com youtube analytics v1 reference reports query 对于 MCN
  • Cassandra 备份,包括架构

    我感兴趣的备份技术有两种 a SCHEMA 备份 恢复数据库模式 添加或删除列 更改列类型 添加表等 b 数据备份 恢复数据 更新 从一个表读取到另一个表 让我通过例子来解释一下 首先 我创建实体 客户 Customer 编号 名称 11
  • 数据表:如何将类设置为表行单元格(但不是表头单元格!)

    我的桌子有一个非常漂亮的风格 抱歉 链接不再有效 我必须添加 sClass 以便新行 由 fnAddData 添加 获得正确的类 不幸的是 这破坏了我的布局 因为这些类也被添加到我的表头单元格中 抱歉 链接不再有效 如何配置 sClass
  • 为什么必须为方法引用显式指定类/对象名称?

    当我想引用当前范围内的方法时我仍然需要 指定类名 对于静态方法 或this before 操作员 例如 我需要写 import java util stream Stream public class StreamTest public s
  • 如何使用 Apache PDFBox 从 PDF 中的按钮图标提取图像?

    我想使用 java netbeans 从 pdf 中的按钮获取图像图标 并将其放在某个面板中 然而我在这里碰了砖头 我使用 PDFBox 作为我的 PDF 导出器 但我似乎理解不够 我已经成功地从表单字段中读取内容 但是只要我尝试在 PDF
  • 处理 SFSafariViewController 中的弹出窗口/选项卡

    我正在我的应用程序中实现 SoundCloud 登录流程 应用程序打开https soundcloud com connect in an SFSafariViewController with a redirect uri它使用我的应用程
  • Java 包结构中的模块与层

    我曾经把所有东西都放在这样的包中 com company app module1 com company app module2 但它使得基于包的 AOP 切入点变得困难 并导致需要 IDE 才能理解的巨大包 所以现在我意识到我需要一个更深
  • jqm 弹出窗口未打开

    我向 div 容器添加了一个弹出窗口 打开弹出窗口不起作用 这是我的容器结构 div div div style display none a class select Button a div ul ul div div
  • 为什么 Node.js 是异步的?

    实际上没有人问过这个问题 从我得到的所有 建议 以及我在这里问之前的搜索 那么为什么 Node js 是异步的呢 经过一番研究后我得出的结论是 像 PHP 和 Python 这样的语言是脚本语言 我可能对脚本语言的实际语言是错误的 而 Ja
  • auth.uid 是共享秘密吗?

    看来 当有人通过 oAuth 进行身份验证时 Firebase 会创建一个看起来像这样的 uidgoogle 111413554342829501512 例如 在 Firebase 规则中 您可以执行以下操作 读取和 或写入 read ro
  • Ember.js 在特定页面上包含外部脚本

    我试图弄清楚如何包含外部 javascript 源 图表 但仅限于网站上的单个页面 可以在视图或模板中完成吗 我发现只需添加页面模板不起作用 如果我将它添加到整个网站的模板中 它加载得很好 但是它会加载到每个页面上 我的问题的另一面可能更具
  • 如何使用“git submodule”查看子模块的特定版本?

    我该如何为特定标签或提交添加 Git 子模块 子模块存储库保持指向特定提交的分离 HEAD 状态 更改该提交只需检查不同的标签或提交 然后将更改添加到父存储库 cd submodule git checkout v2 0 Previous
  • .NET 4 中的 Math.Round() 行为[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中 Math Round 2 5 结果是 2 而不是 3 你在开玩笑吧 https stackoverflow com questions 977796 in c math round2 5
  • 如何更改弹出菜单中所选项目的颜色?

    我已经设置了背景颜色和文本颜色以及一些其他颜色属性 例如禁用和未选择的颜色 但似乎都没有更改所选项目的背景颜色 如果我必须更改以下属性才能使其看起来像我想要的那样 或者我需要在我的代码中添加什么 我有以下内容
  • 使用 ARM NEON 内在函数添加 alpha 和排列

    我正在开发一个 iOS 应用程序 需要相当快地将图像从 RGB gt BGRA 转换 如果可能的话 我想使用 NEON 内在函数 有没有比简单分配组件更快的方法 void neonPermuteRGBtoBGRA unsigned char