优化RGBA->RGB arm64组装

     2023-02-16     64

关键词:

【中文标题】优化RGBA->RGB arm64组装【英文标题】:Optimize RGBA->RGB arm64 assembly 【发布时间】:2013-12-18 16:06:25 【问题描述】:

我编写了这个非常简单的 NEON 实现来从 RGBA 转换为 RGB。它可以工作,但我想知道是否还有其他方法可以进一步提高性能。

我尝试使用预取大小并进一步展开循环,但性能并没有太大变化。顺便说一句,在预取维度方面是否有任何经验法则?我在网上找不到任何有用的东西。此外,在“ARMv8 指令集概述”中,我看到还有一个用于存储的预取,这有什么用?

目前我在 iPhone5s 上转换 1280x720 图像大约需要 1.7 毫秒。

// unsigned int * rgba2rgb_neon(unsigned int * pDst, unsigned int * pSrc, unsigned int count);
_rgba2rgb_neon:
    cmp     w2, #0x7
    b.gt    loop

    mov     w0, #0
    ret

loop:
    prfm    pldl1strm, [w1, #64]

    ld4.8b  v0, v1, v2, v3, [w1], #32
    ld4.8b  v4, v5, v6, v7, [w1], #32

    prfm    pldl1strm, [w1, #64]

    st3.8b  v0, v1, v2, [w0], #24
    st3.8b  v4, v5, v6, [w0], #24

    subs    w2, w2, #16
    b.gt    loop

done:
    ret

【问题讨论】:

【参考方案1】:

首先(因为我假设您的目标是 iOS),vImage(Accelerate.framework 的一部分)为您提供这种转换,如vImageConvert_RGBA8888toRGB888。这具有适用于所有 iOS 和 OS X 系统的优势,因此您无需为 arm64、armv7s、armv7、i386、x86_64 编写单独的实现。

现在,可能是您自己编写此转换作为练习,而不是因为您根本不知道已经有一个转换。在这种情况下:

避免使用ld[34]st[34]。它们很方便,但通常比使用 ld1 和置换要慢。 对于像这样完全常规的数据访问模式,不需要手动预取。 用ld1.16b加载四个16b RGBA向量,用三个tbl.16b指令从中提取三个16b RGB向量,用st1.16b存储它们 或者,尝试使用非临时加载和存储 (ldnp/stnp),因为您的图像太大而无法放入缓存中。

最后,回答您的问题:存储的预取提示主要是有用的,因为某些实现可能会因未命中缓存的部分行写入而出现严重停顿。尤其是简单的实现可能会因任何未命中缓存的写入而停滞。

【讨论】:

在 iPad Mini Retina(Apple A7 处理器)上测试,似乎表明存储的非临时提示对性能没有影响。 @BitBank:非临时存储有利于性能的条件很难描述。重要的是要记住,它们最大的好处之一是它们避免分配到内部缓存中,这意味着它们的影响有时仅在围绕被修改以使用它们的循环的代码中可见。我的指导实际上是“尝试它们,衡量整个程序的性能,如果它们有改进,就使用它们”。 我通过测试一个写入大于 L2 缓存的图像缓冲区的函数得出了这个结论。数据只被写入,直到稍后再被引用。这似乎是尝试存储指令的“流式”版本的理想案例。我需要在 Nvidia K1 Denver 上对此进行测试,看看其行为是否与 Apple A7 不同。快更新...【参考方案2】:

如果你想用 alpha 通道做一些有趣的事情,除了把它放在你的肩膀上之外,另请参阅 vImageFlatten_RGBA8888toRGB888。

【讨论】:

使用 arm neon 进行 Rgb 到灰度转换

...为灰度,因此我从here获得了一个函数,它解释了如何从rgba转换为灰度。现在我正在尝试做同样的事情,但只使用rgb。我改变了一些东西,但似乎效果不佳。我不知道为什么,有人看到我的错误吗?voidneon_asm_conve 查看详情

优化系列汇编优化技术:arm架构64位(aarch64)汇编优化及demo

DATE:2021.8.15文章目录1、arm架构64位优化基础知识2、ARMv8/AArch64neon指令格式3、ARM相关编译参数4、查看状态标记位NZCV的方法5、A64指令集特有的指令及其用法6、资料文档查阅7、AArch64asmdemo8、优化经验总结(满满的干货)1、arm架构6... 查看详情

将 RGBA 颜色转换为 RGB

】将RGBA颜色转换为RGB【英文标题】:ConvertRGBAcolortoRGB【发布时间】:2011-01-0404:31:21【问题描述】:如何将一个RGBA颜色元组,例如(96,96,96,202)转换为对应的RGB颜色元组?编辑:我想要的是在白色背景上获得一个与RGBA元组视觉上最... 查看详情

rgb() 和 rgba() 不透明度有啥区别?

】rgb()和rgba()不透明度有啥区别?【英文标题】:Whatisthedifferencebetweenrgb()andrgba()opacity?rgb()和rgba()不透明度有什么区别?【发布时间】:2021-05-0706:47:29【问题描述】:我在SO上发现了另一个关于rgb与rgba非常相似的问题,但它缺少... 查看详情

正则表达式 javascript 以匹配 RGB 和 RGBA

】正则表达式javascript以匹配RGB和RGBA【英文标题】:regexjavascripttomatchbothRGBandRGBA【发布时间】:2011-11-2412:31:20【问题描述】:目前我有这个匹配RGB字符串的正则表达式。我需要对其进行增强,使其足够强大以匹配RGB或RGBA。rgbRegex=... 查看详情

霓虹灯和手臂组装优化

】霓虹灯和手臂组装优化【英文标题】:Neonandarmassemblyoptimization【发布时间】:2015-08-0122:32:16【问题描述】:我在Neon和arm组件中实现了一个计算机视觉卷积算法,其中每个像素都替换为九个自身和相邻像素的和积。主循环如下... 查看详情

在白色上将 RGB 转换为 RGBA

】在白色上将RGB转换为RGBA【英文标题】:ConvertRGBtoRGBAoverwhite【发布时间】:2011-10-0401:58:35【问题描述】:我有一个十六进制颜色,例如#F4F8FB(或rgb(244,248,251)),我想将其转换为as-transparent-as-possiblergba颜色(当显示为白色时)... 查看详情

十六进制到rgb或rgba半透明

...fined'){return'rgb('+rgb.join(',')+')';} return'rgba('+rgb.join(',')+','+opacity+')';}; 查看详情

使用 SSE2 优化 RGB565 到 RGB888 的转换

】使用SSE2优化RGB565到RGB888的转换【英文标题】:OptimizingRGB565toRGB888conversionswithSSE2【发布时间】:2015-02-1512:27:45【问题描述】:我正在尝试使用带有基本公式的SSE2优化从565到888的像素深度转换:col8=col5<<3|col5>>2col8=col6<... 查看详情

html中docpyte是啥

...3位十六进制简写表示;单词表示;RGB(数字)表示方法;rgba(数字)表示方法。红色:red/#ff0000/#f00/RGB(255,0,0)/rgba(255,0,0,1)绿色:green/#00ff00/#0f0/RGB(0,255,0)/rgba(0,255,0,1)蓝色:blue/#0000ff/#00f/RGB(0,0,255)/rgba(0,0,255... 查看详情

生成随机颜色(代码片段)

定义一个函数,返回一个随机的rgb颜色和这个颜色的随机透明度的颜色rgba0-255(包含)  随机透明度0-1(不含)[‘rgb(0,100,255)‘,‘rgba(0,100,255,0.125)‘];<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><met 查看详情

Sass/Compass - 将 Hex、RGB 或命名颜色转换为 RGBA

】Sass/Compass-将Hex、RGB或命名颜色转换为RGBA【英文标题】:Sass/Compass-ConvertHex,RGB,orNamedColortoRGBA【发布时间】:2012-03-0511:08:32【问题描述】:这可能是Compass101,但是有没有人写过一个mixin来设置颜色的alpha值?理想情况下,我希望m... 查看详情

将 RGBA 转换为 HEX

】将RGBA转换为HEX【英文标题】:ConvertRGBAtoHEX【发布时间】:2014-03-0119:34:37【问题描述】:给定一个css颜色值,例如:rgba(0,0,0,0.86)如何将其转换为考虑alpha分量的RGB十六进制值,假设背景为白色?【问题讨论】:RGBA也许,RGB不能... 查看详情

如何使用 javascript/jquery 知道给定字符串是 hex、rgb、rgba 还是 hsl 颜色?

】如何使用javascript/jquery知道给定字符串是hex、rgb、rgba还是hsl颜色?【英文标题】:HowcanIknowifagivenstringishex,rgb,rgbaorhslcolorusingjavascript/jquery?【发布时间】:2015-12-1621:16:24【问题描述】:我使用正则表达式作为十六进制。/^\\#([a-fA-... 查看详情

快速有效地从具有 rgb/rgba 纹理的 flt 对象传输到具有 jpg/png 纹理的 fbx

】快速有效地从具有rgb/rgba纹理的flt对象传输到具有jpg/png纹理的fbx【英文标题】:Quickandefficientwaytotransferfromanfltobjectwithrgb/rgbatexturestofbxwithjpg/pngtextures【发布时间】:2018-02-1400:44:21【问题描述】:我有几个非常大的flt格式的目标... 查看详情

rgba–ie回退

...ca,Arial,sans-serif;}p{color:rgb(225,225,225);background:rgba(156,217,107,0.25)none;width:400px;margin:48pxauto;padding:32px40px;}p:hover{background:rgba(156,217,107,0.50)none;} </style> <!--[iflteIE8]><styletype="... 查看详情

如何更改rgba图像的单个像素?(代码片段)

...ound1.png");julia>x=image1[1].r0.776N0f8julia>image1[1].r=0ERROR:typeRGBAisimmutable原来朱莉娅的RGBA类型是不可变的。有没有办法可以改变图像的各个像素(R,G和B组件)?答案只需制作一个新的RGB 查看详情

将十六进制转换为 RGBA

】将十六进制转换为RGBA【英文标题】:ConvertHextoRGBA【发布时间】:2014-03-0523:39:32【问题描述】:我的小提琴-http://jsbin.com/pitu/1/edit我想尝试一个简单的hex到rgba的转换。我使用过的浏览器默认使用rgb呈现颜色,因此当使用farbtastic... 查看详情